人總是很忙的,但是一個人就是一個人,不存在分身術。 假設有個人王大柱,他是光明中學的校長,還是光明村的村委會成員,同時還是他兒子的父親。 那麼我們可以這麼想:王大柱是一個類的具體的實現對象,這類名叫“王大柱類”,而王大柱類實現了三個介面:“I光明中學校長”、“I光明村村委會成員”、“I父親”。 畫圖 ...
人總是很忙的,但是一個人就是一個人,不存在分身術。
假設有個人王大柱,他是光明中學的校長,還是光明村的村委會成員,同時還是他兒子的父親。
那麼我們可以這麼想:王大柱是一個類的具體的實現對象,這類名叫“王大柱類”,而王大柱類實現了三個介面:“I光明中學校長”、“I光明村村委會成員”、“I父親”。
畫圖如下:
那麼我們可以稱這三個介面為這個類的三個“身份”。
我們可以這樣製造一個王大柱出來:
王大柱類 王大柱 = new 王大柱類();
此時,“王大柱”這個變數就代表了[王大柱類]的實例。這個沒問題吧?
戲劇性的事情來了。
>“王大柱”在學校是什麼身份呢?按正常的角度,他應該是校長的身份,管理學校的方方面面才對。
>“王大柱”在村委會是什麼身份呢?按正常角度,他應該是村委會成員,參與村委會的會議和討論。
>“王大柱”在家裡是什麼身份呢?按正常的角度,他應該是他兒子的父親,在家帶孩子陪老婆。
所以接下來的代碼大家看仔細了:
// 王大柱要以校長身份去開師生會議 I光明中學校長 王校長 = 王大柱 as I光明中學校長; 王校長.召開師生會議();
我們知道,介面可以定義變數,也可以實例化對象(用於實例化的類必須實現該介面)。
現在,我用I光明中學校長這一身份,去定義“王校長”這個變數,或者說定義這張工作證,有了這張工作證,“王大柱”這個人,身份就會轉化為"王校長",但是"王校長"還是王大柱,並不是第二個人。這就是說,我在上面用關鍵字new的“王大柱”,在記憶體(地球)中只有一個對象(人),介面定義的"王校長"這個變數,僅僅指向了wdz這個人,給了他一層校長的身份而已。
如下圖:
熟悉C++指針/記憶體堆棧的同學一定不陌生,左邊就是堆,右邊就是棧,堆是真正的數據,而右邊的“王大柱”、“王校長”,只是一些變數,真正的數據和變數之間的關係,在這裡就是引用關係。
但是介面編程又有一個不同的特點,也是極為重要的一個特點:介面有自己的成員變數。
換句話說,“王大柱”在家裡,不是學校的“校長”,校長給老師和主任發通知的功能就沒了呀!難道向老婆兒子發命令?找打。
這就是身份的問題,介面可以為堆上的對象提供不同的身份,實現不同的功能。
再來看下麵的代碼:
// 王大柱要去開會 I光明村村委會成員 王委員 = 王校長 as I光明村村委會成員; 王委員.到村裡開會(); // 王大柱要回家做飯給兒子吃 I父親 王爸爸 = 王委員 as I父親; 王爸爸.給兒子做飯();
讀者可以自己想象了嗎?
這就是介面多態,實際上,真正的編程里還有更複雜的介面與抽象類繼承關係,以後再寫吧。
附:OOP(面向對象編程)三大特征
封裝、繼承、多態
這三個特征一直持續到編程的“設計模式”及以後更高層次的編程中。