Курс языка программирования 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.
Навигация по курсу
← Ромб классов | Добавьте метод →