-1

下面是一个最小化的示例,其中我有OA.pm(父对象)、OB.pm子对象和运行脚本:

对象 OB:

package OB;

use OA;
require Exporter;
@ISA = (Exporter, OA);
@EXPORT = ();

sub new {
    my $class = shift;

    print $class->SUPER;
    bless {}, $class;
};

1;

对象 OA:

package OA;

require Exporter;
@ISA = (Exporter);
@EXPORT = ();

sub new {
    bless {}, shift;
};

1;

和跑步者:

#!/usr/bin/perl

use strict;
use warnings;
use OB;

print OB->new;

当我运行它时,我得到:

Can't locate object method "SUPER" via package "OB" at OB.pm line 10.

1) 可能有什么问题?

2) 如果我有多个父母,SUPER 会指出什么?

3) 是use OA强制性的吗?

4

1 回答 1

3

与 Ruby 不同,您必须明确说明您所指的整个方法。

print $class->SUPER::new;

那是假设您想调用该方法。如果您的意图是找出包含新方法的父类,那很复杂,我将跳过这里的解释。

如果你的类有多个父类,多重继承,Perl 通常会首先通过父类深度寻找匹配的方法。这通常是有问题的,您可以切换到避免菱形继承问题的C3方法解析顺序 (mro)use mro "c3"

更多关于如何 SUPER 和多重继承的信息。

最后,use OAorrequire OA是强制加载 OA 类的。您可以在一行中使用use parent "OA".

于 2012-11-10T08:44:15.460 回答