1. 程式人生 > >[面向對象雜談]接口與多態

[面向對象雜談]接口與多態

定義變量 img 面向對象編程 oop 陌生 繼承 工作 中學 mage

人總是很忙的,但是一個人就是一個人,不存在分身術。

假設有個人王大柱,他是光明中學的校長,還是光明村的村委會成員,同時還是他兒子的父親。

那麽我們可以這麽想:王大柱是一個類的具體的實現對象,這類名叫“王大柱類”,而王大柱類實現了三個接口:“I光明中學校長”、“I光明村村委會成員”、“I父親”。

畫圖如下:

技術分享

那麽我們可以稱這三個接口為這個類的三個“身份”。

我們可以這樣制造一個王大柱出來:

王大柱類 王大柱 = new 王大柱類();

此時,“王大柱”這個變量就代表了[王大柱類]的實例。這個沒問題吧?

戲劇性的事情來了。

>“王大柱”在學校是什麽身份呢?按正常的角度,他應該是校長的身份,管理學校的方方面面才對。

>“王大柱”在村委會是什麽身份呢?按正常角度,他應該是村委會成員,參與村委會的會議和討論。

>“王大柱”在家裏是什麽身份呢?按正常的角度,他應該是他兒子的父親,在家帶孩子陪老婆。

所以接下來的代碼大家看仔細了:

// 王大柱要以校長身份去開師生會議
I光明中學校長  王校長 = 王大柱 as  I光明中學校長;
王校長.召開師生會議();

我們知道,接口可以定義變量,也可以實例化對象(用於實例化的類必須實現該接口)。

現在,我用I光明中學校長這一身份,去定義“王校長”這個變量,或者說定義這張工作證,有了這張工作證,“王大柱”這個人,身份就會轉化為"王校長",但是"王校長"還是王大柱,並不是第二個人。這就是說,我在上面用關鍵字new的“王大柱”,在內存(地球)中只有一個對象(人),接口定義的"王校長"這個變量,僅僅指向了wdz這個人,給了他一層校長的身份而已。

如下圖:

技術分享

熟悉C++指針/內存堆棧的同學一定不陌生,左邊就是堆,右邊就是棧,堆是真正的數據,而右邊的“王大柱”、“王校長”,只是一些變量,真正的數據和變量之間的關系,在這裏就是引用關系。

但是接口編程又有一個不同的特點,也是極為重要的一個特點:接口有自己的成員變量。

換句話說,“王大柱”在家裏,不是學校的“校長”,校長給老師和主任發通知的功能就沒了呀!難道向老婆兒子發命令?找打。

這就是身份的問題,接口可以為堆上的對象提供不同的身份,實現不同的功能。

再來看下面的代碼:

// 王大柱要去開會
I光明村村委會成員 王委員 = 王校長 as I光明村村委會成員;
王委員.到村裏開會();

// 王大柱要回家做飯給兒子吃 I父親 王爸爸 = 王委員 as I父親; 王爸爸.給兒子做飯();

讀者可以自己想象了嗎?

這就是接口多態,實際上,真正的編程裏還有更復雜的接口與抽象類繼承關系,以後再寫吧。

附:OOP(面向對象編程)三大特征

封裝、繼承、多態

這三個特征一直持續到編程的“設計模式”及以後更高層次的編程中。

[面向對象雜談]接口與多態