Cha*_*ens 17
您可以创建纯虚拟类(如果使用Moose或MooseX :: Declare,则可以创建角色):
package Foo;
use strict;
use Carp;
sub new { croak "new not implemented" };
sub do_x { croak "do_x not implemented" };
sub do_y { croak "do_y not implemented" };
Run Code Online (Sandbox Code Playgroud)
但执法将在运行时进行.通常,需要接口,因为该语言不支持多重继承并且是严格类型的.Perl支持多重继承和(使用Moose)类似多重继承(但更好)的角色,它是动态类型的.严格vs动态类型归结为鸭子打字(如果它像鸭子一样quacks(),像鸭子一样散步(),像鸭子一样游泳(),那么它就是鸭子.在Perl中,你说:
if ($some_obj->can("quack") {
$some_obj->quack;
} else {
croak "incompatible class type: ", ref $some_obj;
}
Run Code Online (Sandbox Code Playgroud)
ijw*_*ijw 11
在传统的Perl OO中,实施的很少.你可以选择$ obj-> can('methodname')来躲避你正在使用的东西,但是没有什么比接口更像.
(但看看驼鹿,那里的角色可能就是你所追求的.)