面向对象的基本对象定义和在Perl中的使用

spl*_*nux 1 oop perl

很抱歉打扰社区,但遗憾的是我在Perl中编写代码:'(.这是关于我想要了解的OO perl代码,但我没有将所有部分放在一起.

以下是代码模板,它代表了我目前正在看的内容.以下是MyClass类:

package Namespace::MyClass;
sub new($)
{
    my ($class) = @_;
    $self = { };
    bless ($self, $class);
}

sub init($$)
{
    my ($self, $param1) = @_;
    $self->{whatever} = ($param1, $param1, $param1);
}
Run Code Online (Sandbox Code Playgroud)

然后以下是一个应该使用该类的script.pl:

#!/path/to/your/perl

require Namespace::MyClass;

my myClass = new Namespace::MyClass()

myClass->init("data_for_param1");
Run Code Online (Sandbox Code Playgroud)

可能有错误但我更感兴趣的是回答了以下问题而不是纠正了我可能错误的代码:

  • 问题组1:子定义中的"$"表示我需要提供一个参数,对吧?如果是这样,为什么新的要求一个,我不提供它?是否与脚本中的调用使用()或类似于Python的工作方式(自我隐含)?
  • 问题组2:与上一个原因相同,init子程序(这里是一个方法)声明期望两个参数?如果是这样,那么暗示自我的祝福是否会传递给模块中的所有功能?

我问这个是因为我在非祝福模块中看到一个$ =一个参数.

感谢您的时间.

tjd*_*tjd 6

QG1:

原型(如"$")在Method调用中完全没有任何意义.

方法调用也不受原型的影响,因为要调用的函数在编译时是不确定的,因为调用的确切代码依赖于继承.

最有经验的Perl民众完全避免使用原型,除非他们试图模仿内置功能.一些没有Perl经验的PHB强制要求他们使用它们的错误观念,即它们就像其他语言的原型一样.

Method调用的第一个参数是调用Method的Object(Blessed Ref)或Class Name(String).对于你的new方法,它将是'Namespace :: MyClass'.

明智的话: 也避免间接方法调用. 使用直接方法调用重写您的行,如下所示:my $myClass = Namespace::MyClass->new;

QG2:

你的init方法是$myClass第一个参数,因为它是所谓的"方法".第二个参数来自参数列表.祝福将类的名称绑定到引用,以便在看到方法调用时,它知道在哪个类中开始搜索正确的sub.如果sub未立即找到正确的内容,则会在类的@ISA数组中指定的类中继续搜索.

  • 另外,即使这些不是方法调用,原型也没有效果,因为在编译调用时,类还没有被加载(因为使用`require`而不是`use`) (2认同)