Курс Raku / Об’єкти, введення-виведення та винятки / Класи та об’єкти / Протокол метаоб’єктів 🆕 / Вправи / Ромб класів

Розв’язання: Ромб класів

Ось один із можливих варіантів розв’язання задачі.

Код

class A {
}

class B is A {
}

class C is A {
}

class D is B is C {
}

say D.^mro.map(*.^name);

🦋 Вихідний код можна знайти у файлі diamond-mro.raku.

Вивід

(D B C A Any Mu)

Коментарі

  1. D успадковує одразу від двох батьків — class D is B is C перелічує кожного з власним is. Це множинне успадкування, і A, B, C, D утворюють ромб: два шляхи від D угору до спільного предка A.

  2. .^mro сплощує цей ромб в єдиний лінійний порядок пошуку. Спершу йде D, потім його батьки B та C у порядку запису, потім спільний A, і нарешті Any та Mu.

  3. Хоча і B, і C ведуть до A, тип A з’являється один раз, і лише після них обох. У цьому й полягає суть порядку розв’язання методів: кожен тип відвідується рівно раз, і батько ніколи не стоїть перед дитиною, яка від нього успадковує, — тож метод, визначений у B, завжди знаходиться раніше за той, який він перекрив би в A.

Навігація курсом

Ромб класів   |   Додайте метод