我应该在编译时而不是运行时建立继承,如果是这样,为什么?

Eug*_*ash 6 perl inheritance

Perl中的AFAIK继承通常设置如下:

package Mule;
our @ISA = ("Horse", "Donkey");
Run Code Online (Sandbox Code Playgroud)

是否有更好的例子use base(或use parent)更好?

ziy*_*iya 5

use base qw(Horse Donkey);
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

BEGIN {
    require Horse;
    require Donkey;
    push @ISA, qw(Horse Donkey);
}
Run Code Online (Sandbox Code Playgroud)

如果您需要加载模块代码以及继承模块代码,它会更整洁.顺便说一句,有多重继承的问题,但这是一个不同的问题:)

编辑:编译时v.运行时优势:

  • 使用base具有编译时检查的安全性,这意味着如果文件系统上没有基本模块,则脚本甚至不会启动.
  • 如果您想在运行时决定使用给定的模块,那么您可以测试并将模块添加到您的父级:

    if(eval {require X}){push @ISA,'X'; }

  • 您可以使用父qw(基类)或使用基本qw(基类).父母比基础更可取,因为它有更少的暗魔法,但它不像核心那样在核心. (3认同)

Sch*_*ern 3

在编译时建立继承可以避免特别难以调试的依赖循环,如下所示。

# Child.pm
package Child;

our @ISA = qw(Mother);

use Foo;

# Mother.pm
package Mother;

sub wibble { 42 }

# Foo.pm
package Foo;

use Child;
Child->wibble;
Run Code Online (Sandbox Code Playgroud)

Child->wibble如果您在“使用 Foo”之前“使用 Child”,那么 Foo 将在其建立继承之前尝试调用Mother。如果相反,Childuse parent qw(Mother)会在尝试加载其他任何内容之前建立其继承。

我在私人公司代码中经历了这种依赖循环,它往往比公共代码更加交织在一起。调试很糟糕,这就是为什么我建议总是在编译时建立继承。