将SUPER引用到超类的对象

时间:2011-01-12 14:52:05

标签: perl oop inheritance super

请参阅old的perldoc http://perldoc.perl.org/perlobj.html

根据文件: “重要的是要注意SUPER指的是当前包的超类,而不是指对象的超类。”

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

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

3 个答案:

答案 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模块。