Не применяются ли типизированные подписи для заглушенных методов в ролях для 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 не применяет подпись, только то, что метод с соответствующим именем объявлен в потребителе.

Я не знаю, почему это так работает.

Другие вопросы по тегам