Perl 指对象的超类

Perl 指对象的超类,perl,oop,inheritance,super,Perl,Oop,Inheritance,Super,有关oop,请参阅perldoc 根据文件: “需要注意的是,SUPER指的是当前包的超类,而不是对象的超类。” 现在,我的情况是,我需要SUPER来引用对象的超类 所以,寻找任何方法来实现它。给定一个类结构,如 package BaseClass; sub some_method { ... } ... package SubClass; our @ISA = qw(BaseClass); sub some_method { ... } ... 和代码一样 package MainPac

有关oop,请参阅perldoc

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

现在,我的情况是,我需要SUPER来引用对象的超类


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

给定一个类结构,如

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_方法。在
子类
包中,您可以调用
$object->SUPER::some_方法(…)
。但是,无论您是否在
子类
包中,您都可以显式地调用所需的方法

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

我建议你研究一下这个模块。

你真的需要做这样的事情是相当罕见的,通常这是一个迹象,表明你在一个物体内胡闹,以后会回来咬你。如果确实需要这样做,您可以只为方法调用更改包以更改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();

最好的答案实际上取决于您真正想做什么,以及为什么这需要您围绕标准继承工作。

您能建议我如何在package MainPackage中使用$object调用基类的some_方法()。正如我写的:
BaseClass::some_方法($object)
BaseClass::some_方法($object,@other_args)
.Perl的
object->METHOD
构造只是调用
ObjectClass::METHOD($object)的语法糖
其中
ObjectClass
$object
@darch的引用类型-您首选的替代方案是什么?
使用base/使用parent
?从技术上讲,驼鹿。但是
使用base
是这种情况下合适的结构。(为什么不
parent
,因为它更具版本诺斯替派。)请澄清:是什么让你相信你需要这样做?