Курс по 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. Танцуващ робот

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

Решение: Наследен атрибут   |   Композиране на няколко роли