Не применяются ли типизированные подписи для заглушенных методов в ролях для Perl6?
Я пытаюсь сделать некоторые ООП с Perl6 и у меня есть небольшие проблемы с ролями. Я пытаюсь использовать их аналогично интерфейсу 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-подход к ООП и типизированию, и, возможно, есть другой, более Perl6ish способ сделать то, что я хочу...
1 ответ
Если вы объявите метод, используя multi method
в роли, то P6 обеспечивает, что есть multi method
у потребителя с соответствующей подписью. (Это позволяет и другие подписи.)
Если вы опустите multi
в роли P6 не применяет подпись, только то, что метод с соответствующим именем объявлен в потребителе.
Я не знаю, почему это так работает.