天天看點

甘草的《面向對象理論》閱讀筆記

今天讀了 甘草的《面向對象理論》 ,内容還是比較基礎的,不過有兩點比較關注

一是類與類之間的關系,除了 has-a(聚合), is-a(繼承), can-do(實作) 之外,在第八篇 提到了 implement-with 關系

以前沒有考慮過C++ public, protected, private 繼承之間不同。文中明确指出了 C++ 中隻有 public 繼承是 is-a 關系,而 protected 則是 implement-with 關系。所謂的 implement-with ,則是指 class A 實作了某一功能,而 class B 利用 class A 的功能實作自身的功能。例子請看原文

二是第九篇 中提到的矩形和正方形關系。這個問題以前也考慮過。為什麼數學中“正方形是特殊的矩形”這一論斷,到了OOP中就不對了呢?原因其實在于“正方形”和“矩形”的概念改變了

在數學中,給定一個頂點和長寬,就确定了一個矩形。如果改變頂點或者長寬,那就是另外一個矩形了。但是在設計矩形類的時候,一般都會具有設定頂點和長寬的函數。于是,同一個矩形對象,可以改變它的頂點和長寬,表示(數學意義上)不同的矩形了。

如果我們在設計矩形類時為這個類加上不變性(immutable),即對象建立出來後就不能改變了,那麼這個矩形類才能真正表達數學上的矩形;從它派生出正方形類,雖然可能會有資料備援,但卻不會有邏輯上的問題了。

不可變類的典型例子,就是 C# 中的 string 類。string 類沒有提供任何改變對象自身的方法,隻提供了從一個 string 對象構造出新的 string 對象的方法。