在平時說到物件導向的特性的時候,一般的答案有幾種。
如果是物件導向的3大基本特徵:①抽象,繼承,多型②封裝,繼承,多型
如果是4特徵:抽象,封裝,繼承,多型
可見抽象與封裝這兩個概念其實聯絡是很緊密的。
而我確實想要搞清楚具體的含義,今天進行乙個總結。
其中關於抽象與封裝,以**大全為主要參考。
關於多型以c++ primer為主要參考。
其中我引用原文的地方都會首先標出,我開始自己總結時又會空一行開始。
內容為:抽象與封裝,c++的多型。
1.抽象與封裝
主要參考的是**大全5,6兩章。
5.3節---形成一致抽象
原文:抽象是一種能讓你在關注某一概念的同時可以放心地忽略其中一些細節的能力——在不同的層次處理不同的細節。
5.3節---封裝實現細節
原文:封裝填補了抽象留下的空白。
6.1節---抽象資料型別
原文:抽象資料型別(adt)是指一些資料以及對這些資料所進行的操作的集合。
6.2節---良好的封裝
原文:封裝是乙個比抽象更強的概念。抽象通過提供乙個可以讓你忽略實現細節的模型來管理複雜度,而封裝則強制阻止你看到細節。
這兩個概念之所以相關,是因為沒有封裝時,抽象往往很容易被打破。
書中乙個準則是,當我們在運算元據的時候,不應該用物件直接對資料進行訪問,我們應該使用與資料對應的那些操作去操縱資料。
而這些操作(子程式)如果對於外部可見,就是類的公開介面。
而公開介面就是一種抽象,它避免了我們在資料結構的低層次上操縱資料。
因此,我的理解是
我們在定義乙個類的時候,設計了類的資料成員(private),方法,並規定了哪些方法public,哪些方法private。
這個過程本身既包括了抽象,也包括了封裝。
如果一定要進行乙個劃分,那麼
抽象:將資料,方法整合到乙個類裡面,並且希望使用者只使用方法去運算元據成員,而且希望哪些方法應該被類使用者呼叫。
封裝:然後在此基礎上,物理上規定哪些成員為public,哪些成員為private。
所以作者說的,讓我們在不同層次上處理細節。我的理解是:
假如說有乙個聚會人員名單,你使用乙個queue來儲存每乙個報名者,那麼你對人員的增刪就需要對於這個queue來操作。這是具體的資料結構層次。
如果你抽象為adt,那麼使用者就對聚會人員這個物件直接add(某人),或者delete(某人)這樣的操作,使用者也不知道是用vector,還是queue,還是stack來存的。
作者說的,封裝填補了抽象留下的空白。我的理解是:
封裝保證了抽象想要達到的目的的實現。因為封裝在抽象的基礎上,規定了public,private。這樣強制規定了可見性。這就是填補了空白的意思。
2.多型
c++的多型廣義上來說有:靜態多型性,動態多型性。
靜態多型性通常稱為編譯時多型,通過函式過載來實現。
動態多型性通常稱為執行時多型,通過虛函式來實現。
在物件導向的範疇來說的多型特徵,是指動態多型性。這個特性在c++ primer 5th中被直接描述為動態繫結(dynamic binding)或者執行時繫結(run-time binding)。
15.3節---虛函式
原文:引用或指標的靜態型別與動態型別不同這一事實正是c++語言支援多型性的根本所在。
通過物件進行的函式呼叫將在編譯時繫結到該物件所屬類的函式版本上。
當且僅當對通過指標或者引用呼叫虛函式時,才會在執行時解析該呼叫,也只有在這種情況下物件的動態型別才有可能與靜態型別不同。
15章術語表
原文:動態型別(dynamic type)物件在執行時的型別。引用所引用物件或者指標所指物件的動態型別可能與該引用或指標的靜態型別不同。
基類的指標或引用可以指向乙個派生類物件。
在這樣的情況下,靜態型別是基類的引用(或指標),而動態型別是派生類的引用(或指標)。
動態繫結(dynamic binding)直到執行時才確定到底執行函式的哪個版本。
在c++語言中,動態繫結的意思是在執行時根據引用或指標所繫結物件的實際型別來選擇執行虛函式的某乙個版本。
集合術語來看,書中講的已經非常明白了。因為本身在繼承的基礎上就存在靜態與動態型別2種型別。
動態繫結的兩個必要條件就是:
①基類中必須使用虛函式或純虛函式。
②呼叫函式時要使用基類的指標或者引用。
物件導向的4要素 抽象,封裝,繼承,多型
在平時說到物件導向的特性的時候,一般的答案有幾種。如果是物件導向的3大基本特徵 抽象,繼承,多型 封裝,繼承,多型 如果是4特徵 抽象,封裝,繼承,多型 可見抽象與封裝這兩個概念其實聯絡是很緊密的。而我確實想要搞清楚具體的含義,今天進行乙個總結。其中關於抽象與封裝,以 大全為主要參考。關於多型以c ...
物件導向三要素 繼承 封裝 多型
繼承 繼承是一種建立新類的方式,在python中,新建的類可以繼承乙個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類 base 只檢視從左到右繼承的第乙個子類,bases 則是檢視所有繼承的父類 如果沒有指定基類,python的類會預設繼承object類,object是所有python...
物件導向 繼承 抽象
抽象類可以繼承多個介面 介面可以繼承多個介面 類只能單繼承抽象類或多重繼承 抽象類不能例項化物件 介面也不能例項化物件 但是都可以通過 繼承抽象類或繼承介面的子類來是例項化物件 employee定義類 package 工資系統 public abstract class employee publi...