什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

注意到了嗎,在職業面試中,那些老掉牙的問題總被一遍又一遍地重複。

你一定知道我想說什麼。

比如:

你五年之內的規劃是什麼?

更有甚者:

你覺得你最大的缺點是什麼?

呃,停一下。我覺得不會回答這個問題是我的一個缺點。不管怎樣,這不是我的觀點。

儘管這些問題很瑣碎,但它們會讓別人對你的心理狀態、態度、觀點有一些初步瞭解,所以它們很重要。

你必須謹慎地回答這些問題,否則以後會後悔的。

今天我想談一談編程世界裡一種相似的問題:面向對象程序設計的主要原則是什麼?

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

在這個問題上我是中立的。這個話題會被頻繁地提起,所以你必須知道如何應對。

新手們通常都會面對這個問題,因為面試官可以從中輕鬆地看出三件事:

1.候選人是否為面試做了準備?

如果聽到了不假思索的回答,這表明他的態度端正,會是一個加分點。

2.候選人是否通過了入門階段?

理解面向對象程序設計的原則,表明你已經能夠從更高的層面來看問題,而不是侷限於從教程中複製粘貼那個層面。

3.候選人的理解是深刻還是膚淺?

相信我,在這個問題上表現出來的能力級別,通常等價於在其他大部分學科上的能力級別。

面向對象程序設計的四個原則是封裝、抽象、繼承和多態。

對於一個新手程序員,這些詞彙也許聽起來有點嚇人,而維基百科裡對此複雜的、冗長的解釋有時會讓程序員的焦慮加倍。

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

所以,我要給每個概念一個簡短清晰的解釋。也許我的解釋聽起來有點過於簡單,就像講給小孩子聽的那樣,但如果我是面試官,聽到這種回答我會很滿意。

封裝

假設我們有一個程序。根據程序定義的規則,它在邏輯上有一些不同的對象,並且這些對象彼此之間會相互交流。

在一個類中,當每個對象的狀態保持相對孤立,就實現了封裝。其餘的對象並不能觀察到這個對象的狀態。他們能做到的只有調用一些被稱作“方法”的通用功能。

因此,對象使用方法掌控著自己的狀態,除非明確允許,沒有其他人可以接觸到它。如果你想和某個對象交流,你需要使用提供的方法。但在默認情況下,你無法改變對象的狀態。

假設我們要構建一個小型的模擬遊戲,遊戲裡有人有貓,他們之間可以交流。如果我們想使用封裝,就得把所有“貓”邏輯封裝到貓類中。看上去是這樣的:

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

你可以喂貓,但你不能直接改變貓的飢餓狀態

在這裡,貓的飢餓與能量狀態是私有變量。它也有一個私有方法喵()。只要它願意,就可以隨時調用,其他類不能控制貓去喵喵叫。

人們能做的事情被定義在通用方法中,是睡覺(),玩耍(),餵食()。他們都能或多或少地調整內部狀態並有可能調用喵()。這樣就建立了私有狀態和通用方法之間的橋樑。

這就是封裝。

抽象

抽象可以被看作封裝的自然擴展。

在面向對象的程序設計中,程序通常都很龐大。獨立的對象之間能夠進行大量的交流。要想在不斷的變化中維護這樣一個龐大的代碼庫多年,是很困難的。

抽象是為了簡化這個問題而存在的一個概念。

使用抽象表示每個對象只能有一個高等級使用機制。

這個機制應該隱藏內部實現細節,只展現與其他對象相關聯的操作。

想想一臺咖啡機。它能幹許多事情,它的引擎會發出許多古怪的噪音。但你需要做的只是加入咖啡,按個按鈕而已。

如果這個機制易於使用,不會隨著時間推移有多少變化,就更好了。

抽象在現實生活中還有什麼例子?

想想你使用手機的場景:

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

手機內部結構很複雜,但使用起來卻很簡單。

你只需要通過幾個按鈕就能與手機互動。後蓋下面的元件在怎樣運轉?你不需要知道。

執行的細節被隱藏起來了。你需要的只是一組簡單的動作。

執行更改,比方說某軟件的升級,並不會影響你對抽象的使用。

繼承

我們已經知道了封裝和抽象是如何幫助我們開發並維繫代碼庫了。

但你知道,在面向對象程序設計中,另一個常見的難題是什麼嗎?

那就是,對象通常都很相似。它們有共同的邏輯。但它們並不完全相同。呃……

那麼我們怎樣才能重用這些共同的邏輯,並將其抽取加入獨立的類?繼承是個好辦法。

這表示你從一個(父)類中衍生出另一個(子)類。這樣我們就完成了一次繼承。

子類再次利用了父類(常規部分)的所有域和方法,並能執行自己的(獨特部分)。

例如:

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

家庭教師是教師的一個種類。任何一個老師都是人類的一個種類。

如果我們的程序需要管理私人教師和公共教師,同時也需要其他種類的人,比如學生,那麼我們可以執行這一類。

通過這種方式,每個類再次利用父類的共同邏輯時,就可以只添加自身必需的部分。

多態

現在我們終於來到了最複雜的概念了!

“多態”(Polymorphism)在希臘語中表示“多種形態”的意思。

我們已經知道了繼承的力量,並很滿意地使用著它。但是,麻煩出現了。

假設我們有一個父類和一些由它衍生出的子類。有時我們會需要一個包含了所有這些類的集合,比如一個列表。或者說我們為父類添加了一個方法,但我們也想讓子類使用它。通過使用多態就可以解決這個問題。

簡單來說,多態提供了一種完全像使用其父類一樣,使用別的類的方式,這樣就不會將雜糅在一起的各個類搞混。但是每個子類仍然保留著自己的私有方法。

一般通過定義需要重用的(父)接口來實現。它列出許多通用方法,然後,每個子類裝載屬於自己的方法的版本。

每當集合(比如列表)或方法需要父類(給出通用方法)的例子,語言就會著重評估通用方法是否正確執行,無論它被傳遞給了哪個子類。

讓我們來看看幾何圖形實現的草圖。它們重用一個用於計算表面積和周長的公共界面。

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋

在同一個集合中,三角形、圓形、矩形可以同時使用。

讓這三個圖形繼承父圖形界面,可以創建混合三角形、圓形和矩形的列表。你可以像對待同樣類型的對象一樣處理它們。

接下來,如果列表嘗試計算元素的表面積,正確的方法就會被立刻找到並執行。如果元素是三角形,三角形的計算表面積()就會被調用。如果它是圓形,圓形的計算表面積()就會被調用。以此類推。

如果你能通過參數操作圖形,就不需要將三角形、圓形、矩形一個個定義三次。

你可以只定義一次,並把數據留下作為參數。只要實現計算參數(),不管什麼形狀都無所謂。

我希望這能夠對你有所幫助。你可以在面試的時候直接使用這些解釋。

原文鏈接:

https://medium.freecodecamp.org/object-oriented-programming-concepts-21bb035f7260

智能觀 編譯

—完—

親愛的朋友:

這篇文章讓我想起兩件事。

1.一次課堂上,老師說,他在招聘時,經常會問一些很基礎的問題。想看看對方是怎麼理解的,怎麼運用的。

事實上,他經常遇到一些說自己取得了多少成績,分數多高的學生,但面對基礎問題時,大部分只懂背概念,不懂怎麼運用。

2.《三傻大鬧寶萊塢》中,課堂上老師提問什麼機械的概念時,蘭徹的回答。

希望本文對你有所幫助。

祝安!

智能觀 一米

2018-7-4 於北京中關村

想知道AI加教育領域有哪些最新研究成果?

想要AI領域更多的乾貨?

請到智能觀 找找看。

編譯文章旨在幫助讀者瞭解行業新思想、新觀點及新動態,為原作者觀點,不代表智能觀觀點。

什麼是封裝、抽象?面試官可不愛聽概念,給你份孩子也能懂的解釋


分享到:


相關文章: