Не применяются ли типизированные подписи для заглушенных методов в ролях для Perl6? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь сделать ООП с 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 Ответ

0 голосов
/ 18 октября 2018

Если вы объявляете метод, используя multi method в роли, то P6 принудительно указывает, что в получателе есть multi method с совпадающей подписью.(Он также допускает другие подписи.)

Если вы опустите multi в роли, P6 не применяет подпись, только если метод с соответствующим именем объявлен впотребитель.

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

...