首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

面向對象語言理論(四):徹底分離子類化與子類型——從 Self 類型到對象協議

     編輯:關於C++

背景:繼承、子類化、子類型的糾葛

傳統 OO 語言(Simula、C++、Java、C#)將 繼承、子類化、子類型 綁定:子類即子類型,支持 子類型多態。但反協變位置上的 Self 類型(如二元方法參數)打破了這一關係,導致 子類不再是子類型,需尋找新的代碼復用抽象。

核心案例:Max 與 MinMax

類型定義

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]。類型是其協議算子的 不动点。

子協議關係

  • Post-fixpoint: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 協議的排序模板。

總結

  • Self 類型 在反協變位置打破 Subclassing ⇒ Subtyping。
  • 對象協議 以類型算子捕獲結構契約,子協議關係 <# 替代子類型。
  • 犧牲隱式多態,換取更安全的二元方法建模與泛型復用能力。
  • 現代語言映射:Rust Trait、Swift Protocol、C++ Concepts 均體現「協議導向」思想。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved