[面向對象雜談]接口

人老是很忙的,可是一我的就是一我的,不存在分身術。編程

假設有我的王大柱,他是光明中學的校長,仍是光明村的村委會成員,同時仍是他兒子的父親。設計模式

那麼咱們能夠這麼想:王大柱是一個類的具體的實現對象,這類名叫「王大柱類」,而王大柱類實現了三個接口:「I光明中學校長」、「I光明村村委會成員」、「I父親」。spa

畫圖以下:設計

 

那麼咱們能夠稱這三個接口爲這個類的三個「身份」。指針

咱們能夠這樣製造一個王大柱出來:code

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

此時,「王大柱」這個變量就表明了[王大柱類]的實例。這個沒問題吧?對象

 

戲劇性的事情來了。blog

>「王大柱」在學校是什麼身份呢?按正常的角度,他應該是校長的身份,管理學校的方方面面纔對。繼承

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

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

 

因此接下來的代碼你們看仔細了:

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

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

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

以下圖:

 

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

可是接口編程又有一個不一樣的特色,也是極爲重要的一個特色:接口有本身的成員變量。

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

這就是身份的問題,接口能夠爲堆上的對象提供不一樣的身份,實現不一樣的功能。

 

再來看下面的代碼:

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

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

讀者能夠本身想象了嗎?

 

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

封裝、繼承、多態

這三個特徵一直持續到編程的「設計模式」及之後更高層次的編程中。

相關文章
相關標籤/搜索