2011-01-12 42 views
9

请参阅接力 http://perldoc.perl.org/perlobj.html参考SUPER到对象的超

中的perldoc按文件: “需要注意的是SUPER重要的是指当前包的超类(ES),而不是到对象的超类。“

现在,我处于一种需要SUPER来引用对象的超类的情况。

所以,寻找任何方式来实现它。

+0

请澄清:什么说服你,你需要能够做到这一点? – darch 2011-01-12 18:21:18

回答

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 [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(); 

最好的答案真的取决于你真的想做什么,为什么这需要你解决标准的继承问题。

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。在​​包内,您可以拨打$object->SUPER::some_method(...)。但是,你是否是在​​包里面,你总是可以显式调用所需的方法

BaseClass::some_method($object, ...) 
+0

您能否给我建议我如何使用$ MainPackage包中的$ object来调用BaseClass的some_method()。 – rpg 2011-01-12 15:26:59