Курс по Raku / Обекти, вход-изход и изключения / Класове и обекти / Протоколът на метаобектите 🆕 / Exercises / Ромб от класове

Решение: Ромб от класове

Ето едно възможно решение на задачата.

Код

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.

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

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