用通俗的比喻梳理「面向對象」的概念
來自專欄碼上有對象4 人贊了文章
這篇文章會提到的概念有:
類、繼承、介面、委託、重載、覆蓋、方法、屬性、事件。
不過別怕,本文不會用艱澀的語言來表述這些概念,樓主盡量用小白式的語句來解釋,爭取能幫助新手理解這些東西。
類
【類】用最簡單的表述方式就是:
用類來組詞:類別、種類、人類、分門別類……
總而言之就是:概括共性!
方法、屬性和事件
方法就是一個東西(姑且把人也算成東西)做的動作。
屬性就是一個東西的特質。
事件就是在一個東西上發生的事情。
比如小明是一個人類。
- 小明吃飯(方法),
- 能吃5碗(屬性),
- 吃了5碗,飽了(事件)。
屬性和方法的主體都是接收者,而事件的主體是發送者。(暈了是不?)
用凡間的話來解釋就是:
- 大腦給小明發送指令:去吃飯。
- 大腦監視小明:要吃5碗。
- 小明的胃告訴大腦:我吃飽了。
前兩條,小明都只是一個「接收者」,大腦是「發送者」。第三條中,小明變成了「發送者」,大腦變成了「接收者」。綜上,方法、屬性都是從里往外傳的,事件是從外往裡傳的:
然後把目光回到電腦上,來看看「登錄知乎」這件事情怎樣用屬性、方法、事件來解釋:你點擊「登錄」,發生了「點擊」事件,事件作為一個信號,傳回知乎的伺服器。伺服器執行「驗證用戶名和密碼」的方法,並且根據校驗的結果,返回一個結論:登錄成功或失敗。如果成功,則載入這個用戶的「等級、回答數」等屬性。
繼承、重載、覆蓋(重寫)、隱藏、密封、保護的概念。
小明他爹是個開麵館的,小明從小就喜歡吃面。他爹老了之後,無力經營麵館,於是把麵館傳位予小明(繼承,直接複製父類的東西到自己身上),小明家本來就世代以買面為生,小明自然是獲得了一脈單傳。所謂青出於藍,小明的技藝當然不下於前輩,他不僅會做面,更能利用做面的技術做出其他比如燒餅一類的東西(重載,在父類的方法上擴展,用以處理更多類型)。隨著時代的進步,後來有了麵條機,老爹那一套做面的手藝已經完全過時了,雖然也叫做面,但現在做面的步驟已經和以往完全不相干(重寫,沿用原名,但方法完全改變),小明還有個妹妹,但是很可惜,做面這種技術向來是傳男不傳女(protect保護,限制訪問,僅允許自己和繼承者訪問),但是小妹實在是想學習做面的技術,卻又不想讓小明家族指責,於是小妹就偷偷學了他爹的做面技術(隱藏),並且給這個技術自己起了個名字藉以掩人耳目(隱藏類可以突破保護限制,但需要new一個名字)。好景不長,這件事情後來還是被小明發現了,東窗事發,於是小明決定嚴守做面的秘籍,不再下傳(密封類,禁止繼承)。
介面的概念
介面有什麼用?先來看一下「不關心用途,直接操作對象」的潛在後果:
一日,小明要切菜,於是對年幼的小妹說:「去,給我拿把刀來。」,小妹屁顛屁顛的去拿了一把磚刀過來,根本無法切菜好么!此時內心一萬隻羊駝在狂奔。
於是小明後來放聰明了,他這樣說:
雖然沒有說明拿個什麼東西,但是,能夠保證一定能切菜!即使:
那時候小明還不是很富裕,家裡只有菜刀,後來條件變好了,有特製的切菜機器,但是,無論怎樣,「給我拿個切菜的東西來!」這句話,永遠都能得到想要的結果!因為,介面只關心用途,不管怎樣實現。所以,介面的用途是:
委託的概念和作用
- 委託有什麼用?
先來看不用委託的例子:
小明的麵館里來了一位吃霸王餐的顧客,吃完不給錢,走了。小明只好上門要賬,但是,霸王客不在家!真是掃興。然後小明決定過幾天再來。小明過幾天又來了一次,結果,還是不在家,小明回去,第二天,那個霸王客又回家了。耽誤了小明很多時間,事情還沒辦成……
- 假如用了委託:
在上面這個例子中,小明委託了鄰居幫忙看著客人,自己可以做自己的事情。鄰居,就是一個委託,委託本身,是不做「收賬」的事情的,他起到的是一個「通知方法執行的對象和時機」的這麼一個作用。小明的麵館里來了一位吃霸王餐的顧客,吃完不給錢,走了。小明只好給霸王客的鄰居打電話,畢竟這個人是小明的親戚,說是見到這個人回來,就找人去收賬!
所以,委託的作用是:
把目光拉回到電腦上:假設電腦上有一件事情要做,但是做的時機是無法預知的,如果「等」,那麼程序就會假死(處於等待狀態),所以比較好的辦法就是使用委託,委託的特點是:只管吩咐,不管執行。就好像上面的例子,吩咐的人是小明(主程序),委託人是鄰居(委託),至於他要找什麼人、怎麼收賬、什麼時候收賬,那都是他的事情,小明並不關心。好了,至此,這幾個概念也梳理完成了,還有不懂的也可以問我。
圖片是百度上搜索的,字是我自己打的。
收工,遁!
推薦閱讀: