Курс языка программирования 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.

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

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