傳統 OO 語言(Simula、C++、Java、C#)將 繼承、子類化、子類型 綁定:子類即子類型,支持 子類型多態。但反協變位置上的 Self 類型(如二元方法參數)打破了這一關係,導致 子類不再是子類型,需尋找新的代碼復用抽象。
ObjectType Max is
var n: Integer;
method max(other: Max): Max;
end;
ObjectType MinMax is
var n: Integer;
method max(other: MinMax): MinMax;
method min(other: MinMax): MinMax;
end;
class MaxClass is
var n: Integer := 0;
method max(other: Self): Self is
if self.n > other.n then return self else return other end;
end;
end;
subclass MinMaxClass of MaxClass is
method min(other: Self): Self is
if self.n < other.n then return self else return other end;
end;
end;
Self 在繼承中特化:MaxClass.max 參數為 Max,MinMaxClass.max 參數為 MinMax。此為 反協變 參數類型。
假設 MinMax <: Max,則 MinMaxClass' 繼承 MinMaxClass 並覆寫 max 調用 other.min(self)。若 MinMax <: Max 成立,MinMaxClass' 對象可作 Max 使用,傳入無 min 方法的 Max 對象導致運行時錯誤。故 MinMax 不是 Max 的子類型。
ObjectOperator MaxProtocol[X] is
var n: Integer;
method max(other: X): X;
end;
ObjectOperator MinMaxProtocol[X] is
var n: Integer;
method max(other: X): X;
method min(other: X): X;
end;
Max = MaxProtocol[Max],MinMax = MinMaxProtocol[MinMax]。類型是其協議算子的 不动点。
MinMax <: MaxProtocol[MinMax](MinMax 滿足 Max 協議)。MinMaxProtocol <:: MaxProtocol 定義為 ∀T. MinMaxProtocol[T] <: MaxProtocol[T]。S <# T ⇔ S <: T-Protocol[S](結構子類型)。// F-bounded polymorphism
ObjectOperator P1[X <: MaxProtocol[X]] is ... end;
// Higher-order bounded polymorphism
ObjectOperator P2[P <:: MaxProtocol] is ... end;
語法糖:MinMax <# Max 表示子協議關係。無 Subsumption,不可隱式轉換,但配合泛型實現 靜態鴨子類型,如要求類型支持 Comparable 協議的排序模板。
Subclassing ⇒ Subtyping。<# 替代子類型。