我正在尝试为子类中的超类泛型方法创建别名,但它似乎不起作用.同一个类中的这个技巧可以工作,但它似乎不适用于超级/子级转换.这是一个真实的基本例子.前两个电话有效.第三次调用会生成有关未定义子例程的错误.我也试过使用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)
您在面向对象的继承和简单的符号导入之间感到困惑.
正如你所说的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)