《冒號課堂》學習筆記 OOP 繼承

2022-09-12 14:30:31 字數 1135 閱讀 4298

提倡介面繼承,慎用實現繼承。

非抽象類不適宜作基類。

為繼承而設計的類應該做到:禁用protected成員域;保證protected成員方法的規範性和穩定性;防止覆蓋的***。

軟體設計應該兼顧靈活性與穩定性,提倡外靜內動。外靜指保持外部的介面不變,內動指允許內部的實現變動。無論是抽象還是設計模式以及庫、框架、架構等的設計,無不將此奉為圭臬。

實現繼承可能會破壞父類的封裝,如訪問父類的protected成員、暴露基礎類、覆蓋父類的方法。

實現繼承最大的硬傷是在類族之間建立了強耦合關係,使**趨於僵硬、脆落和複雜。

子類在覆蓋父類某一方法時,不僅要保證該方法的規範,還要維持相應關聯方法的規範,不能破壞父類規範之內的邏輯關聯。

當祖先類不能在為後代類提供孤立於內部實現的私有介面時,前者的封裝便會被破壞,其改動可能會牽連到後者,造成「脆落的基類」問題。

非多型方法雖然不如多型方法靈活,但更穩定可靠,不僅能避免繼承帶來的安全漏洞和封裝破壞,還可能帶來效能上的改善。

當類的乙個公有方法直接或間接呼叫了自身的另乙個多型方法時,應特別謹慎。如果不能杜絕這類自用,那必須將其規範化,以免被子類錯誤地覆蓋。此外,應盡量採用介面非虛原則來分離介面與掛鉤: 讓該公有方法不是多型的介面,讓該多型方法不是公有的掛鉤。

類的例項方法一般有4種用途(不排除一法多用):

為外界提供服務的公開介面

為子類提供展開點的內部**

為子類或包提供服務的內部介面

為自身提供服務的私有介面

* 除內部**外其他最好是非多型的

繼承與組合的對比

繼承是一種靜態顯性的關係,而組合是一種動態隱性的關係。

實現繼承是灰盒復用,而組合是黑盒復用。

多重繼承通常不被支援或不被提倡,而多重組合則不然。

繼承是對基礎類的兼收幷蓄,而組合是對基礎類的批判繼承。

組合強調整體與部分之間靜態結構上的關係,委託**強調外部介面與內部實現之間動態分離。

合成是一種解決辦法,但也不是沒有缺陷。首先合成的用法不如繼承那麼簡便優雅,這也是許多人喜歡繼承的主要原因。其次,合成不能產生自型別,而有時這正是設計者所需要的。再次,合成無法覆蓋基礎類的方法,也無法訪問它的protected成員。最後,卻可能算是最大的缺陷:合成需要基礎類只能是具體型別,不能是抽象型別。

我的《冒號課堂》學習筆記 值與引用(2)語義型別

值與引用 值語義的物件是獨立的,語義的物件卻是允許共享的。由於j a不支援值型別物件,j a程式設計師才更需要加強這方面的意識。語法和語義並不總是一致的 語法上的值型別可能在語義上是引用型別,語法上的引用型別可能在語義上是值型別。永遠不要忘記乙個基本原則 語法只是手段,語義才是目的。為了判斷乙個型別...

我的《冒號課堂》學習筆記 值與引用(1)語法型別

值與引用 值 value 與引用 reference 因其天生的對立性,提供了乙個二分法 dichotomy 的準則。把資料分成兩類 值 具有某種型別的資料 引用 可用來獲取特定資料的值 把變數分成兩類 值變數 表示值的變數 引用變數 表示引用的變數 把資料型別分成兩類 值型別 能直接被訪問的資料型...

c 學習 oop 三種繼承

date 14 03 21 14 01 description 三種繼承 共有,私有,受保護繼承 class b public a class b private a class b private a 介面繼承 public和實現繼承 private private 修改繼承訪問 去除個別成員 預...