Raku-Kurs / Objekte, Ein- und Ausgabe und Ausnahmen / Klassen und Objekte / Das Metaobjekt-Protokoll 🆕 / Exercises / Ein Diamant aus Klassen

Lösung: Ein Diamant aus Klassen

Hier ist eine mögliche Lösung der Aufgabe.

Code

class A {
}

class B is A {
}

class C is A {
}

class D is B is C {
}

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

🦋 Du findest den Quellcode in der Datei diamond-mro.raku.

Ausgabe

(D B C A Any Mu)

Kommentare

  1. D erbt von zwei Eltern zugleich — class D is B is C führt jeden mit eigenem is auf. Das ist Mehrfachvererbung, und A, B, C, D bilden eine Raute: zwei Wege von D hinauf zum gemeinsamen Vorfahren A.

  2. .^mro plättet diese Raute zu einer einzigen, linearen Suchreihenfolge. D kommt zuerst, dann seine Eltern B und C in der geschriebenen Reihenfolge, dann das gemeinsame A und schließlich Any und Mu.

  3. Obwohl sowohl B als auch C zu A führen, erscheint der Typ A einmal, und zwar erst nach beiden. Genau darum geht es bei einer method resolution order: Jeder Typ wird genau einmal besucht, und ein Elternteil kommt nie vor einem Kind, das von ihm erbt — eine in B definierte Methode wird also immer vor derjenigen gefunden, die sie in A überschreiben würde.

Kursnavigation

Ein Diamant aus Klassen   |   Fügen Sie eine Methode hinzu