伴隨多型的可互換物件
在處理型別的層次結構時,經常想把乙個物件不當作它所屬的特定型別來對待,而是將其當作其基類的物件來對待。這使得人們可以編寫出不依賴於特定型別的**。在「幾何形」的例子中,方法操作的都是泛化(generic)的形狀,而不關心它們是圓形、正方形、三角形還是其他什麼尚未定義的形狀。所有的幾何形狀都可以被繪製、擦除和移動,所以這些方法都是直接對乙個幾何物件傳送訊息;它們不用擔心物件將如何處理訊息。
這樣的**是不會受新增新型別影響的,而且新增新型別是擴充套件乙個物件導向程式以便處理新情況的最常用的方式。例如,可以從「幾何形」中匯出乙個新的子型別「五角形」,而並不需要修改處理泛化幾何形狀的方法。通過匯出新的子型別而輕鬆擴充套件設計的能力是對改動進行封裝的基本方法之一。這種能力可以極大地改善我們的設計,同時也降低軟體維護的代價。
但是,在試圖將匯出型別的物件當作其泛化基型別物件看待時(把圓形看作是幾何形,把自行車看作是交通工具,把鸕鶿看作是鳥等等),仍然存在乙個問題。如果某個方法要泛化幾何形狀繪製自己、讓泛化交通工具行駛,或者讓泛化的鳥類移動,那麼編譯器在編譯時是不可能知道應該執行哪一段**的。這就是關鍵所在:當傳送這樣的訊息時,程式設計師並不想知道哪一段**將被執行;繪圖方法可以被等同位地應用於圓形、正方形、三角形,而物件會依據自己的具體型別來執行恰當的**。
如果不需要知道哪一段**會被執行,那麼當新增新的子型別時,不需要更改呼叫它的方法,它就能夠執行不同的**。因此,編譯器無法精確地了解哪一段**將會被執行,那麼它該怎麼辦呢?例如,在下面的圖中,birdcontroller物件僅僅處理泛化的bird物件,而不
深度探索C 物件模型 之物件的差異加上多型之後
class zooanimal class bear public zooanimal dances dance know zooanimal za zoey zooanimal pza za bear b yogi bear pb b bear rb pb 基類zooanimal的物件布局如下,假...
物件導論之被隱藏的具體實現
讓客戶端程式員無法觸及他們不應該觸及的部分 這部分對於資料型別的內部操作是必須的,但並不是介面的一部分。允許庫設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程式員。緊隨其後的元素對於任何人都是可用的 表示除了型別建立者和型別的內部方法之外的任何人都不能訪問的元素,private就像類建立者和...
C 面對物件之封裝 繼承 多型的簡單理解
一 封裝 隱藏物件的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀取和修改的訪問級別。簡單來多,就是講我們所需要的 打包封裝進入乙個類裡面,便於我們呼叫,操作。這就是封裝。這樣就隔離了具體的變化,便於使用,提高了復用性和安全性 二 繼承 繼承可以使得子類具有父類的屬性和方法或者重新定義 追加屬...