Perl 当我有多重继承时,SUPER是未定义的
下面是一个最小化的示例,其中我有Perl 当我有多重继承时,SUPER是未定义的,perl,oop,Perl,Oop,下面是一个最小化的示例,其中我有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 Expo
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;
当我运行它时,我得到:
无法通过OB.pm第10行的包“OB”找到对象方法“SUPER”。
1) 有什么不对劲吗
2) 如果我有一个以上的父母,那么SUPER会指向什么
3) 是否必须使用OA?与Ruby不同,您必须明确说明所指的整个方法
print $class->SUPER::new;
这是假设您想要调用该方法。如果您的目的是找出哪个父类包含新方法,这很复杂,我将跳过这里的解释
如果您的类有多个父类多重继承,Perl通常会首先通过父类深度查找匹配方法。这通常是有问题的,您可以切换到withuse mro“c3”
,这样可以避免错误
最后,
useoa
或requireoa
是加载OA类所必需的。您可以使用在一行中加载和继承类。您好,我刚刚更新了我的问题,我将其分为三部分,您能检查一下吗?(第二个和第三个)得到并更新了它。你打算从print$class->SUPER
中得到什么?没什么,我试图创建一个真正最小化的示例。。。由于perl通常只打印它的内存地址,只是为了查看它是否工作,请注意,您不需要从Exporter继承。您只需要使用导出器qw(导入)代码>