text: 在計算機科學中，C3演算法主要用在多重繼承中，確定子類應該繼承哪一個父類的方法。換句話說，C3超類線性化的輸出是確定性的方法解析次序。描述.C3演算法得名於它的實現一致於三種重要性質：擴充套件、區域性優先次序和單調性。在1996年的OOPSLA會議上，發表的論文《Dylan的單調超類線性化》，首次提出了C3超類線性化。它在2012年1月被適配到了Open Dylan實現，跟從了一個增進的提議。Python 2.3、Raku、Parrot、Solidity和的面嚮物件語言模組等，將它選作方法解析的預設演算法。Perl 5語言從版本5.10.0起將它作為可選的、非預設的MRO。早期版本Perl 5有稱為codice_1一個擴充套件實現曾釋出於CPAN。Python創始人Guido van Rossum這樣總結C3超類線性化：“基本上，在C3背後的想法是，如果你寫下在複雜的類層級中繼承關係所施加的所有次序規則，這個演算法將確定出滿足所有這些規則的這些類的一個單調次序。如果不能確定出這樣的次序，這個演算法會失敗。”演算法.一個類的C3超類線性化，是這個類加上它的這些父類的線性化和這些父類自身的列表的唯一性歸併的總和。這些父類的列表作為給這個歸併過程的最後實際引數，保持了這些直接父類的區域性優先次序。完成父類的線性化和父類列表的歸併，選擇這些列表的頭部中第一個符合條件者，它不出現在任何這些列表的尾部之中。注意一個良好頭部，可以同時出現為多個列表的第一個元素，但是禁止它出現在任何其他地方。將選擇的元素從以它作為頭部的所有列表中移除，並將它填加到輸出列表。重複選擇並移除良好頭部並擴充套件輸出列表的過程，直到所有餘下的列表被竭盡。如果在某一點上，因為所有餘下列表的頭部都出現在某個列表的尾部中，而沒有良好頭部可選，那麼由於在繼承層級中依賴的不一致次序，歸併過程不能計算下去，故而最初類的線性化不存在。計算一個類的線性化的一種樸素分治法，可以採用遞迴演算法來為歸併子例程找到父類的線性化。但是，這將在出現環狀類層級時導致無限迴圈遞迴。為了檢測這種環並打破無限遞迴，並重新利用前面計算的結果作為一種最佳化，遞迴呼叫應當透過快取或記憶化的方式遮蔽重入以前的實際引數。這個演算法類似於找到拓撲次序。例子.給定用Python3展示例子.首先，定義一個元類來允許物件透過名字簡明表示：class Type(type):def __repr__(cls):return cls.__name__class O(object, metaclass=Type): pass類codice_2透過名字表示自身，而不採用預設表示形式：»&gt; OO»&gt; class X: pass»&gt; X接著構造這個繼承樹：class A(O): passclass B(O): passclass C(O): passclass D(O): passclass E(O): passclass K1(A, B, C): passclass K2(D, B, E): passclass K3(D, A): passclass Z(K1, K2, K3): pass然後就可看到結果：»&gt; Z.mro()[Z, K1, K2, K3, D, A, B, C, E, O, ]用Raku展示例子.Raku預設的對類使用C3線性化：say Z.^mro; # OUTPUT: ((Z) (K1) (K2) (K3) (D) (A) (B) (C) (E) (Any) (Mu))codice_3和codice_4是所有Raku物件從其繼承的型別。
metadata: erhwenkuo/wikipedia-zhtw
metadata: C3線性化
metadata: https://zh.wikipedia.org/wiki?curid=6041954