Cursus Raku / Objecten, in- en uitvoer en excepties / Klassen en objecten / Het meta-objectprotocol 🆕 / Exercises / Een ruit van klassen
Oplossing: Een ruit van klassen
Hier is een mogelijke oplossing voor de taak.
Code
class A {
}
class B is A {
}
class C is A {
}
class D is B is C {
}
say D.^mro.map(*.^name);🦋 Je kunt de broncode vinden in het bestand diamond-mro.raku.
Uitvoer
(D B C A Any Mu)Opmerkingen
Derft van twee ouders tegelijk —class D is B is Cnoemt elk van beide met een eigenis. Dit is meervoudige overerving, enA,B,C,Dvormen een ruit: twee paden vanDomhoog naar de gedeelde voorouderA..^mroplat die ruit uit tot één enkele, lineaire zoekvolgorde.Dkomt eerst, dan zijn oudersBenCin de volgorde waarin ze geschreven zijn, dan de gedeeldeA, en ten slotteAnyenMu.Ook al leiden zowel
BalsCnaarA, het typeAverschijnt één keer, en pas na allebei. Dat is de bedoeling van een method resolution order: elk type wordt precies één keer bezocht, en een ouder komt nooit vóór een kind dat ervan erft — zodat een methode die inBgedefinieerd is altijd gevonden wordt vóór degene die hij inAzou overschrijven.