Курс по 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)Коментари
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.