请参阅old的perldoc http://perldoc.perl.org/perlobj.html
根据文件: “重要的是要注意SUPER指的是当前包的超类,而不是指对象的超类。”
现在,我处于需要SUPER引用对象的超类的情况。
所以,寻找任何方法来实现它。
答案 0 :(得分:8)
你真的需要做这样的事情是非常罕见的,通常这是一个迹象表明你在一个物体内部的捣乱会以后会再次咬你。如果真的需要做什么,你可以改变你的包只是为了方法调用来改变SUPER看到的东西,或者通过调用完整的方法名来覆盖方法查找。
{
package BaseClass;
sub new { bless \my $self, shift; }
sub foo {
my $self = shift;
print "BaseClass::foo()\n";
}
}
{
package SubClass;
our @ISA = qw(BaseClass);
sub foo {
my $self = shift;
print "SubClass::foo()\n";
$self->SUPER::foo();
}
}
{
package ParentClass;
sub new { bless \my $self, shift; }
sub bar {
my $self = shift;
print "ParentClass::bar()\n";
}
}
{
package ChildClass;
our @ISA = qw(ParentClass);
sub foo {
my $other = SubClass->new();
print "ChildClass::foo()\n";
# fails trying to find ParentClass::foo()
eval { $other->SUPER::foo(); } or warn $@;
# thinks this is SubClass and finds BaseClass::foo()
{ package SubClass; $other->SUPER::foo(); }
# if you know the correct class that SUPER::foo() would have called (but this will also work if it was the wrong class)
$other->BaseClass::foo();
}
sub bar {
my $self = shift;
print "ChildClass::bar()\n";
$self->SUPER::bar();
}
}
my $obj_1 = SubClass->new();
$obj_1->foo();
my $obj_2 = ChildClass->new();
$obj_2->bar();
$obj_2->foo();
一个更清晰的选项是重构你的方法,这样你就可以访问基类和子类方法而不试图破坏对象系统。
{
package BaseClass;
sub new { bless \my $self, shift; }
sub foo {
my $self = shift;
print "BaseClass::foo()\n";
}
}
{
package SubClass;
our @ISA = qw(BaseClass);
sub bar {
my $self = shift;
print "SubClass::bar()\n";
$self->SUPER::foo();
}
}
my $obj = SubClass->new();
$obj->foo();
$obj->bar();
或者提供一种调用基类方法的方法。
{
package BaseClass;
sub new { bless \my $self, shift; }
sub foo {
my $self = shift;
print "BaseClass::foo()\n";
}
}
{
package SubClass;
our @ISA = qw(BaseClass);
sub foo {
my $self = shift;
print "SubClass::foo()\n";
$self->SUPER::foo();
}
sub bar {
my $self = shift;
$self->SUPER::foo();
}
}
my $obj = SubClass->new();
$obj->foo();
$obj->bar();
最佳答案实际上取决于您真正想要做的事情,以及为什么要求您解决标准继承问题。
答案 1 :(得分:3)
给出类似
的类结构package BaseClass;
sub some_method { ... }
...
package SubClass;
our @ISA = qw(BaseClass);
sub some_method { ... }
...
和代码如
package MainPackage;
our @ISA = qw(SuperPackage);
my $object = new SubClass(...);
您要在对象上调用BaseClass::some_method
。在SubClass
包中,您可以拨打$object->SUPER::some_method(...)
。但无论您是否在SubClass
包中,您始终可以显式调用所需的方法
BaseClass::some_method($object, ...)
答案 2 :(得分:1)
我建议您查看SUPER模块。