我正在尝试对Perl6进行一些OOP,并且在角色方面遇到了一些麻烦。我试图以与Java接口类似的方式使用它们,在Java接口中,我只是拥有方法签名,而该方法签名必须由执行该角色的任何类来实现。我正在使用带有类型化参数并返回的存根方法。
我注意到类型签名不是强制性的,只是方法的名称。
示例脚本:
#!/usr/bin/env perl6
use v6;
role MyRole {
method intAdder( Int $a, Int $b --> Int ) { ... }
}
# this does the role and the method signature matches
class MyClass1 does MyRole {
method intAdder( Int $a, Int $b --> Int ) { return $a+$b }
}
# this does the role and the method signature does NOT match
# why is this allowed?
class MyClass2 does MyRole {
method intAdder( Str $a --> Str ) { return "Hello, $a." }
}
# this does the role and the method name does not match and gives an error as expected:
# Method 'intAdder' must be implemented by MyClass3 because it is required by roles: MyRole.
#
# class MyClass3 does MyRole {
# method adder( Int $a, Int $b --> Int ) { return $a+$b }
# }
sub MAIN() {
my $object1 = MyClass1.new;
my $object2 = MyClass2.new;
say $object1.intAdder: 40, 2;
say $object2.intAdder: 'world';
}
# output:
# 42
# Hello, world.
我已经阅读了官方文档中的“面向对象”页面,但找不到解决我想要的方法的方法。我还试图采用Java的方式来考虑OOP和键入,也许有一种另一种更Perl6ish的方式来做我想要的...
答案 0 :(得分:6)
如果您在角色中使用multi method
声明方法,则P6会强制使用方中具有匹配签名的multi method
。 (它也允许其他签名。)
如果您省略角色中的multi
,则P6不会强制执行签名,只有在使用者中声明具有匹配名称的方法。
我不知道为什么这样工作。