今天我接受了軟件工程職位的採訪。我已經從面試的stackoverflow中讀了很多東西。他們問我有關OOP的正常情況。但他們也問我這些:封裝,抽象和多態是必需的繼承嗎?
封裝可能沒有繼承?
抽象可能沒有繼承?
多態性可能沒有繼承?
根據我對OOP的瞭解,我已經回答了這些問題。我不知道這是對還是錯。任何人都可以通過一些相關的例子告訴我這些問題的正確答案。
感謝
今天我接受了軟件工程職位的採訪。我已經從面試的stackoverflow中讀了很多東西。他們問我有關OOP的正常情況。但他們也問我這些:封裝,抽象和多態是必需的繼承嗎?
封裝可能沒有繼承?
抽象可能沒有繼承?
多態性可能沒有繼承?
根據我對OOP的瞭解,我已經回答了這些問題。我不知道這是對還是錯。任何人都可以通過一些相關的例子告訴我這些問題的正確答案。
感謝
是的,因爲封裝是通過訪問方法隱藏類外部屬性的能力。
那麼,抽象可以參考很多東西,但談到OOP: 沒有,一個抽象類,不能直接使用的,你只能實例化繼承的類。
是的,多態是構建一個單一的接口到幾種類型的對象,例如,一個單一的函數調用,可以接收不同的類或數據類型作爲參數。它們可以被遺傳或不被遺傳。
封裝絕對有可能沒有繼承。封裝是隱藏數據的概念,外部對象不應該能夠操縱它。封裝的一個例子是Java中對象的私有字段。然後,您可以使用公共方法(例如getter和setter或其他計算方法)僅在需要時操作數據。
然而,抽象和多態性與繼承有直接關係。
抽象是當你拿走一個對象的實現細節並創建一個抽象類或接口(根據Java講話)。這將作爲任何實施或繼承類需要包含在具體實施中的合同。抽象類將有方法簽名,但不包含主體;繼承類將實現這些實體。
多態性是實現抽象形式不同的東西的能力。例如,如果您有一個名爲Animal的抽象類包含speak()方法,則可以創建一個繼承自Animal的Dog類並實現speak()以打印「woof」,而Cat()類將實現speak )打印「喵」。
請注意,它取決於正在檢查哪種類型的多態性。正如另一個答案中所述,您可以擁有方法/函數參數多態性,並且如前所述,沒有繼承是可能的。
嗯,我的理解:
封裝只是一個想法,以避免直接修改的 實例的狀態,它甚至可以完成,無需OOP。
抽象是泛化類(對象模板),它不能 沒有繼承。它側重於共同合同條款。
多態性意味着相同的行爲,但行爲不同。通常它使用抽象/接口 。它不能沒有OOP
沒有OOP或沒有繼承? –
沒有繼承,是的,即使沒有OOP。 –
Encapsulation
是可能做不繼承:
簡單的私人屬性添加到一個類,並使用setter和getter方法來訪問此屬性。
Abstraction
由它的自我是可能沒有繼承: 可以使抽象的類,它不需要任何的繼承。
如果這個問題問的是:可以抽象類沒有 繼承使用?
然後不,它不能沒有繼承使用,因爲它需要首先實例化,因此它需要繼承。但抽象本身並不需要繼承。
Polymorphism
是沒有繼承不可能的:這是因爲這兩種類型的對象之間多態性必須有共同的東西爲它工作。如果是java的話,這甚至可以簡化爲Object
類,從中派生出所有的類。完全取決於語言。例如,在Smalltalk中,您可以在沒有繼承的情況下實現多態,因爲Smalltalk是一種後期綁定語言,只要它們都實現相同的方法(包括簽名),就可以將兩個對象視爲相同對象 –
需要了解的內容。所以在指定語言之前,這個問題沒有正確的答案? – Rana
對這三個問題的回答是肯定的,可以不用繼承來完成,但真正的答案是「它取決於它們實現的語言」。
我的意思是,認爲第一個C++編譯器實際上將它的代碼編譯爲標準C,而不是OOP語言。顯然,代碼必須被編譯爲不支持繼承的語言。
我會說
封裝 - 是的。例如一個操作在其中聲明的靜態變量的函數(如在C++中)。或c代碼隱藏其他編譯單元的非導出變量和函數。
抽象 - 是的。 C++中的「概念」就是一個例子。在C++中,你可以編寫一個例程並說「只要參數類型定義一個小於運算符,這個代碼就會編譯」。
多態 - 是的。一個簡單的函數指針可以用來提供可插入的實現。
因此,在封裝。你是說你有一門課程,你有所有的方法,你想從世界以外的地方隱藏它?對?那麼你的訪問方法在哪裏?如果它在同一班上?那麼他們是不是隱藏? –
我的意思是你想隱藏外部世界的類或實例的屬性,所以你建立方法(setter,getters等)以避免直接訪問它們。這是封裝。 – manolonte
「等」部分是必不可少的。有些人認爲封裝只是提供getter和setter,而沒有意識到它實際上是將數據及其相關行爲(即使用該數據的方法)捆綁在一起。 [http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html](http://www.javaworld.com/article/2075271/core-java/ encapsulation-is-not-information-hiding.html) – Piovezan