我有一个从超类调用方法的子类。超类中的方法使用在超类中定义为抽象(不是真正抽象)但在子类中实现的方法。
例如:
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;
现在我做的时候:
$sub = new SubClass();
$sub->method1();
...它调用抽象消息,我得到指定的错误消息。如果我从超类中取出抽象方法并将实现留在子类中,它就不会识别该方法并且我得到子程序抽象方法未找到错误。
答案 0 :(得分:5)
您尚未在父类和子类之间建立IS_A关系。
您可以使用Ivan建议的base
编译指示执行此操作,也可以操作@ISA
数组。或者您可以使用parent
编译指示。
package SubClass;
our @ISA = qw( BaseClass );
parent
package SubClass;
use parent qw( BaseClass );
顺便说一下,不要使用间接对象语法。要调用构造函数,请执行以下操作:
我的$ foo = SubClass-> new();
此外,您似乎没有使用strict和warnings pragma。这样做。总是
最后,如果一个文件中有多个包,则将每个包封装在一个块中会很有帮助。
查看perlboot和perltoot,它们是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" );
在剧本中:
my $obj = SubClass->new;
$obj->method;
my $base = BaseClass->new;
$base->method;
绝对阅读我链接的教程。他们会帮助你。
答案 1 :(得分:3)
你的根本问题是你根本就没有使用方法调用。你做完了吗
sub method1 {
my $self = shift;
$self->someAbstractMethod();
}
在基类中的(并假设继承已正确设置)然后事情就可以了。但是当你写someAbstractMethod()
那不是方法调用时,它是一个函数调用,所以它在编译时立即解决,而不考虑多态(对象的类型是什么)。
答案 2 :(得分:2)
您的代码存在一些问题,您需要告诉子类其父类是什么。您可能还需要设置构造函数以传递给父类。那里也有一些拼写错误。
package BaseClass;
sub new {
bless {} => shift;
}
sub method1 {
my $self = shift;
return $self->someAbstractMethod();
}
sub someAbstractMethod
{
die "oops, this is an abstract method that should " .
"be implemented in a subclass";
}
package SubClass;
use base 'BaseClass';
sub new {
shift->SUPER::new
}
sub someAbstractMethod
{
print "now we implement the asbtract method\n";
}
package main;
my $obj = BaseClass->new;
eval {$obj->method1(); 1} or warn $@;
my $subobj = SubClass->new;
$subobj->method1();
答案 3 :(得分:2)
如果您刚刚开始使用Perl OO,请不要忘记查看Moose。另请参阅Moose::Manual::Unsweetened以了解Moose与常规Perl 5 OOP样式的比较。