Курс 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)Коментарі
Dуспадковує одразу від двох батьків —class D is B is Cперелічує кожного з власнимis. Це множинне успадкування, іA,B,C,Dутворюють ромб: два шляхи відDугору до спільного предкаA..^mroсплощує цей ромб в єдиний лінійний порядок пошуку. Спершу йдеD, потім його батькиBтаCу порядку запису, потім спільнийA, і нарештіAnyтаMu.Хоча і
B, іCведуть доA, типAз’являється один раз, і лише після них обох. У цьому й полягає суть порядку розв’язання методів: кожен тип відвідується рівно раз, і батько ніколи не стоїть перед дитиною, яка від нього успадковує, — тож метод, визначений уB, завжди знаходиться раніше за той, який він перекрив би вA.
Навігація курсом
← Ромб класів | Додайте метод →