A C3 szuperosztályú linearizálás egy olyan algoritmus , amelyet elsősorban egy többszörös öröklődésű hierarchia stabil linearizálására használnak az objektumorientált programozásban . Ez a linearizálás a módszerek öröklésének sorrendjének meghatározására szolgál, amelyet az angol szakirodalom gyakran "MRO"-nak (a "Method Resolution Order" rövidítése, azaz "method resolution order") emleget. A címben szereplő C3 a végső linearizálás három fő jellemzőjét jelöli: stabil és bővülő (idősség szerint) gráf , a lokális prioritási sorrend megőrzése és a monotonitás. Ezt az elméletet először 1996 -ban mutatták be az OOPSLA konferencián , a "Monotone Superclass Linearization for the Dylan Language" [1] című tanulmányában . Ezt követően ezt az algoritmust választották alapértelmezett algoritmusként a metódusfeloldáshoz a Python 2.3 (és újabb), a Perl 6 és a Parrot virtuális gépek programozási nyelvében . Alternatívaként is elérhető (nem az alapértelmezett MRO) a Perl 5 magban az 5.10.0 verzió óta. A Perl 5 korábbi verzióihoz egy kiterjesztett megvalósítást Class::C3 -nak hívnak, és a CPAN -on létezik .
Mert
O osztály Az A osztály kiterjeszti az O-t A B osztály kiterjeszti az O-t A C osztály kiterjeszti az O-t A D osztály kiterjeszti az O-t Az E osztály kiterjeszti az O-t A K1 osztály kiterjeszti az A-t, B-t, C-t A K2 osztály kiterjeszti D, B, E A K3 osztály kiterjeszti D, A-t Z osztály K1, K2, K3 kiterjesztiZ linearizálását úgy tekintjük, mint
L(O) := [O] // O linearizálása triviális, ez egy egyelemű lista [O], mert O-nak nincsenek szülei L(A) := [A] + merge(L(O), [O]) // A linearizálása A, plusz A szülei és A szülei linearizációinak uniója = [A] + összevonás ([O], [O]) = [A,O] L(B) := [B, O] // B, C, D és E linearizálása L(C) := [C,O] L(D) := [D, O] L(E) := [E, O] L(K1) := [K1] + merge(L(A), L(B), L(C), [A, B, C]) // először keressük meg a K1 szülőinek linearizációit: L(A ), L(B) és L(C); és csatlakoztassa őket a szülők listájához [A, B, C] = [K1] + merge([A, O], [B, O], [C, O], [A, B, C]) // Az A osztály alkalmas az első összevonási lépésre, mert csak a minden lista elején = [K1, A] + merge([O], [B, O], [C, O], [B, C]) // az O osztály nem megfelelő, mert a 2. és 3. listák végében van, de... = [K1, A, B] + összevonás ([O], [O], [C, O], [C]) = [K1, A, B, C] + merge([O], [O], [O]) // végül is az O osztály marad az egyetlen és utolsó jelölt = [K1, A, B, C, O] L(K2) := [K2] + összevonás(L(D), L(B), L(E), [D, B, E]) = [K2] + összevonás ([D, O], [B, O], [E, O], [D, B, E]) // D kiválasztása = [K2, D] + egyesítés([O], [B, O], [E, O], [B, E]) // O nem megfelelő, válassza a B-t = [K2, D, B] + egyesítés([O], [O], [E, O], [E]) // O nem fér, válassza az E-t = [K2, D, B, E] + egyesítés ([O], [O], [O]) // válassza az O-t = [K2, D, B, E, O] L(K3) := [K3] + összevonás(L(D), L(A), [D, A]) = [K3] + összevonás ([D, O], [A, O], [D, A]) = [K3, D] + összevonás ([O], [A, O], [A]) = [K3, D, A] + összevonás ([O], [O]) = [K3, D, A, O] L(Z) := [Z] + összevonás(L(K1), L(K2), L(K3), [K1, K2, K3]) = [Z] + összevonás ([K1, A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K1, K2, K3]) / / válassza a K1-et = [Z, K1] + összevonás ([A, B, C, O], [K2, D, B, E, O], [K3, D, A, O], [K2, K3]) // A nem megfelelő, válassza a K2-t = [Z, K1, K2] + összevonás([A, B, C, O], [D, B, E, O], [K3, D, A, O], [K3]) // A nem t illik , D nem illik, válassza a K3-at = [Z, K1, K2, K3] + merge([A, B, C, O], [D, B, E, O], [D, A, O]) // A nem fér, válasszon D = [Z, K1, K2, K3, D] + egyesítés ([A, B, C, O], [B, E, O], [A, O]) // válassza az A = [Z, K1, K2, K3, D, A] + egyesítés ([B, C, O], [B, E, O], [O]) // válassza a B = [Z, K1, K2, K3, D, A, B] + egyesítés ([C, O], [E, O], [O]) // válassza a C = [Z, K1, K2, K3, D, A, B, C] + merge([O], [E, O], [O]) // O nem illik, válassza az E = [Z, K1, K2, K3, D, A, B, C, E] + egyesítés ([O], [O], [O]) // válassza az O = [Z, K1, K2, K3, D, A, B, C, E, O] // válaszMegnevezések:
L(Class) - osztály linearizálása Osztály [A,B,C] – három elemből álló lista, ahol a fej A, a farok pedig [B,C] merge - listák összevonásaAz egyesítő függvény úgy egyesíti a listákat, hogy minden elem pontosan egyszer forduljon elő az eredményben, így hasonló a halmazok egyesítéséhez, de itt fontos az elemek sorrendje a listában. Az egyesítő funkció a következőképpen működik - az argumentumlistákon iterál az előfordulás sorrendjében (balról jobbra), kiválasztva az első elemet, amely több listában lehet az első, de a másodikban és azon túl sehol nem szerepel, és áthelyezi az eredménylistába, kizárva a listákból -argumentumokat, ezt az eljárást többször megismétli, amíg minden elem át nem kerül az argumentumlistákból az eredménylistába. Ha egy szakaszban olyan helyzet áll elő, hogy lehetetlen kiválasztani a megadott feltételnek megfelelő jelölt elemet, pl. ha az összes argumentumlistában az első elemek nem először fordulnak elő más argumentumlistákban, akkor az eredményül kapott lista nem jön létre.