在Perl OOP中继承抽象方法时找不到方法错误

Sam*_*Sam 1 oop perl inheritance abstract

我有一个从超类调用方法的子类.超类中的方法使用在超类中定义为抽象(不是真正抽象)但在子类中实现的方法.

例如:

package BaseClass;

sub new
{

}
sub method1 {

    return someAbstractMethod();
}



sub someAbtsractMethod
{
     die "oops, this is an abstract method that should " . 
         "be implemented in a subclass" ;
}
1;

package SubClass;

sub new
{

}

sub someAbtsractMethod
{
     print "now we implement the asbtract method";
}
1;
Run Code Online (Sandbox Code Playgroud)

现在我做的时候:

$sub = new SubClass();
$sub->method1();
Run Code Online (Sandbox Code Playgroud)

...它调用抽象消息,我得到指定的错误消息.如果我从超类中取出抽象方法并将实现留在子类中,它就不会识别该方法并且我得到子程序抽象方法未找到错误.

dao*_*oad 5

您尚未在父类和子类之间建立IS_A关系.

你可以base像Ivan建议的那样用pragma 做到这一点,或者你可以操纵@ISA数组.或者你可以使用parentpragma.

@ISA:

package SubClass;
our @ISA = qw( BaseClass );
Run Code Online (Sandbox Code Playgroud)

parent:

package SubClass;
use parent qw( BaseClass );
Run Code Online (Sandbox Code Playgroud)

顺便说一句,不要使用间接对象语法.要调用你的构造函数:

my $ foo = SubClass-> new();

此外,您似乎没有使用strictwarnings pragma.这样做.总是.

最后,如果在一个文件中有多个包,则将每个包封装在一个块中会很有帮助.

查看perlbootperltoot,它们是perldoc中的便捷OOP教程.

更新:

我刚注意到你的方法调用被破坏了.您需要在每个方法中找到调用类或实例.

package BaseClass;

sub new { bless {}, shift; }  # horrible constructor - do not reuse.

sub abstract { die "The present situation is abstract"; }

sub method { my $self = shift; $self->abstract; }


package SubClass;

our @ISA = qw( BaseClass );

sub abstract { print "It's alive\n" );
Run Code Online (Sandbox Code Playgroud)

在脚本中:

my $obj = SubClass->new;
$obj->method;

my $base = BaseClass->new;
$base->method;
Run Code Online (Sandbox Code Playgroud)

绝对阅读我链接的教程.他们会帮助你.