请参阅接力 http://perldoc.perl.org/perlobj.html参考SUPER到对象的超
中的perldoc按文件: “需要注意的是SUPER重要的是指当前包的超类(ES),而不是到对象的超类。“
现在,我处于一种需要SUPER来引用对象的超类的情况。
所以,寻找任何方式来实现它。
请参阅接力 http://perldoc.perl.org/perlobj.html参考SUPER到对象的超
中的perldoc按文件: “需要注意的是SUPER重要的是指当前包的超类(ES),而不是到对象的超类。“
现在,我处于一种需要SUPER来引用对象的超类的情况。
所以,寻找任何方式来实现它。
你真的需要做这样的事情是非常罕见的,通常这是一个迹象,表明你在一个对象内部以一种会在稍后回来的时候咬你的方式。如果真的需要做什么,你可以改变你的包只是为了方法调用来改变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 [email protected];
# 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();
最好的答案真的取决于你真的想做什么,为什么这需要你解决标准的继承问题。
给定的一类结构类似
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
。在包内,您可以拨打$object->SUPER::some_method(...)
。但是,你是否是在包里面,你总是可以显式调用所需的方法
BaseClass::some_method($object, ...)
您能否给我建议我如何使用$ MainPackage包中的$ object来调用BaseClass的some_method()。 – rpg 2011-01-12 15:26:59
我建议你看看到SUPER模块。
请澄清:什么说服你,你需要能够做到这一点? – darch 2011-01-12 18:21:18