Perl - 如何在子类中创建方法别名?

Dou*_*uch 0 perl class

我正在尝试为子类中的超类泛型方法创建别名,但它似乎不起作用.同一个类中的这个技巧可以工作,但它似乎不适用于超级/子级转换.这是一个真实的基本例子.前两个电话有效.第三次调用会生成有关未定义子例程的错误.我也试过使用SUPER :: cat,但这也不起作用.

package foo;

sub cat{
  print("inside foo\n");
}

*bird = \&cat;

package bar;

use base 'foo';

*dog = \&cat;

package main;

foo::cat();
foo::bird();
bar::dog();
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 5

您在面向对象的继承和简单的符号导入之间感到困惑.

正如你所说的use base 'foo'宣布一个超级班.这意味着foo将检查对未出现的方法的任何调用bar.

然而,*dog = \&cat这不是一个方法调用:它只是一个全局赋值,所以搜索不会超越&bar::cat.

如果您正在编写真正面向对象的代码,那么分配到*bar::dog那样会破坏继承机制的要点.

要观察Perl的面向对象功能,请将glob分配移动到foo(它只是别名方法)并使用方法调用语法进行调用.

在这段代码中,bar有没有自己的方法和继承一切foo,但代码按预期工作.

package foo;

sub cat {
  print("inside foo\n");
}

*bird = \&cat;
*dog = \&cat;


package bar;

use base 'foo';



package main;

bar->cat();
bar->bird();
bar->dog();
Run Code Online (Sandbox Code Playgroud)

产量

inside foo
inside foo
inside foo
Run Code Online (Sandbox Code Playgroud)