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

面向對象語言理論(三):對象類型、子類化與子類型分離、泛型解決二元方法難題

     編輯:關於C++

一、對象類型:規範與實現分離

早期 OO 語言(Simula)類型與實現混合。現代語言(Modula-3、Java、C#)引入 對象類型:僅聲明屬性簽名與方法簽名,無實現。例如:

class cell {
    var contents: Integer := 0;
    method get(): Integer { return self.contents; }
    method set(n: Integer) { self.contents := n; }
}

subclass reCell of cell {
    var backup: Integer := 0;
    override set(n: Integer) {
        self.backup := self.contents;
        super.set(n);
    }
    method restore() { self.contents := self.backup; }
}

// 對應的對象類型
ObjectType Cell {
    var contents: Integer;
    method get(): Integer;
    method set(n: Integer);
}

ObjectType ReCell {
    var contents: Integer;
    var backup: Integer;
    method get(): Integer;
    method set(n: Integer);
    method restore();
}

無關類可實現同一類型,使用者面向類型編程,實現 接口與實現分離。

二、分離 Subclassing 與 Subtyping

基於結構的子類型

O' <: O 若 O' 擁有 O 所有成員(可更多)。支持多重子類型:ReCell <: Cell 且 ReCell <: ReInteger。

關鍵性質

  • Subclassing ⇒ Subtyping(子類化蘊含子類型)。
  • 逆不成立:無繼承關係的類型若結構兼容,亦構成子類型。
  • 此為 部分分離,稱 subclassing-implies-subtyping。

三、泛型:Bounded Type Parameterization

二元方法問題

素食者吃蔬菜,人吃食物。Vegetarian <: Person 但 eat(Food) 參數反協變,直接繼承導致素食者可吃肉(類型不安全)。

類型算子方案

ObjectOperator PersonEating[F <: Food] {
    method eat(food: F);
}
ObjectOperator VegetarianEating[F <: Vegetable] {
    method eat(food: F);
}

對任意 F <: Vegetable,VegetarianEating[F] <: PersonEating[F]。具體化:Vegetarian = VegetarianEating[Vegetable] <: PersonEating[Vegetable],正確表達「素食者是吃蔬菜的人」。

Bounded Abstract Type 替代方案

ObjectType Person {
    Type F <: Food;
    var lunch: F;
    method eat(food: F);
}
ObjectType Vegetarian {
    Type F <: Vegetable;
    var lunch: F;
    method eat(food: F);
}

創建時綁定具體 F(如 Dessert)。局限:只能吃自帶午餐,無法動態傳入食物。

總結

  • 對象類型 實現規範/實現解耦。
  • 結構子類型 部分分離繼承與子類型。
  • 有界泛型 精確建模二元方法,保持類型安全與表達力。
  • 現代語言映射:Java Generics、C# Generics、C++ Concepts 均採用有界參數化思想。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved