Curso de Raku / Objetos, entrada/salida y excepciones / Clases y objetos / El protocolo de metaobjetos 🆕 / Exercises / Un rombo de clases

Solución: Un rombo de clases

Aquí tienes una posible solución para la tarea.

Código

class A {
}

class B is A {
}

class C is A {
}

class D is B is C {
}

say D.^mro.map(*.^name);

🦋 Puedes encontrar el código fuente en el archivo diamond-mro.raku.

Salida

(D B C A Any Mu)

Comentarios

  1. D hereda de dos padres a la vez: class D is B is C enumera cada uno con su propio is. Esto es herencia múltiple, y A, B, C, D forman un rombo: dos caminos desde D hasta el antepasado común A.

  2. .^mro aplana ese rombo en un único orden de búsqueda lineal. Primero va D, después sus padres B y C en el orden en que se escribieron, después el común A y por último Any y Mu.

  3. Aunque tanto B como C llevan a A, el tipo A aparece una sola vez, y solo después de ambos. Ese es el sentido de un orden de resolución de métodos: cada tipo se visita exactamente una vez, y un padre nunca va antes que una hija que hereda de él, de modo que un método definido en B se encuentra siempre antes que el que sobrescribiría en A.

Un rombo de clases   |   Añada un método