Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Классы и объекты

Роли

Роль — это набор поведения (а иногда и данных), который могут разделять несколько классов. Если наследование говорит, что класс является разновидностью другого, то роль описывает то, что класс умеет делать.

Роль определяется ключевым словом role, во многом как класс, и передаётся классу трейтом does:

role Greet {
    method hello {
        'Hello from ' ~ self.name;
    }
}

class Person does Greet {
    has $.name;
}

Теперь у класса Person есть метод hello из роли — так, как если бы он был написан в самом классе:

say Person.new(name => 'Anna').hello; # Hello from Anna

Класс, выполняющий роль, распознаётся как обладающий этой ролью:

say Person.new(name => 'Anna') ~~ Greet; # True

Обратите внимание, что метод hello из роли использует self.name, хотя у самой роли нет атрибута name. И это нормально: метод выполняется как часть того класса, который включает эту роль, а name предоставляет уже класс. Следующая тема показывает, что класс может брать на себя сразу несколько ролей.

Темы этого раздела

Практика

Пройдите 1 тест по содержанию этого раздела.

Упражнения

В этом разделе 3 упражнения. Прежде чем приступать к практике, изучите все темы раздела.

  1. Коробка с размером
  2. Питомец с именем и возрастом
  3. Танцующий робот

Навигация по курсу

Решение: Унаследованный атрибут   |   Композиция нескольких ролей