2014-06-16 29 views
3

最近有人問我這個問題:「爲什麼要一個重載的方法?」爲什麼我們應該重寫一個方法?

我說,如果我有10種方法的一類,我想使用它的全部功能,除了一個方法,那麼我將覆蓋方法有我自己的功能。

然後面試官在那種情況下回答說,爲什麼我們不能寫一個不同名稱的新方法,而是使用該方法。

是的,這也是對的。現在我很困惑。重寫一種方法的真正目的是什麼?

任何人都可以告訴我嗎?謝謝大家。

+0

繼承想到.. – jahroy

+1

改變一個實現。使其更具體到兒童班。 – Stultuske

+0

重寫一個已經實現的方法是OFTEN打破Liskov替換原則的根本原因(非常糟糕的設計)。一般來說,我們「覆蓋」/(實現而不是更恰當的詞)一種接口/抽象方法。 – Mik378

回答

3

代碼如果您會給另一名在派生類中的方法,你不能使用相同的接口來調用它。您始終可以通過基類指針調用它。

Base p = new Derived(); 
p.overrideMethod(); 

如果派生類是從鹼衍生那麼它會自動調用基地的衍生版本,而不是。在名稱不同的情況下,這是不可能的。它被稱爲接口的代碼而不是實現。

4

好吧,告訴你的面試官,應始終對接口,無法實現:)

+2

我知道這很尷尬,但它根本沒有解決這個問題。 –

+0

你是對的,它只是讓我感到震驚,有人正在招聘不瞭解OOP的基礎知識:) –

0

重寫的好處是:能夠定義特定於子類類型的行爲,這意味着子類可以根據其要求實現父類方法。

1

我說,如果我有10種方法的類,我想用所有的 其功能除了一個方法,那麼我將覆蓋方法 有我自己的功能。

=>很多時候的方式打破Liskov Substitution principle ... =>極壞的面向對象的設計

你有這樣的「破發」的網絡上的例子很多,但一個你可以找到一個很好的解釋here

0

一個使用接口允許多個實現,一個使用覆蓋來簡化接口的實現(例如,在實現WindowListener時,通常擴展並覆蓋WindowAdapter的方法,以便不需要爲默認行爲足夠的情況)。在這種情況下,添加新方法而不是重寫將不起作用,因爲調用方理解接口並調用其方法;這裏覆蓋的重點就是改變調用接口的行爲。如果你只是簡單地添加一個新的函數,那麼調用者就必須知道這個函數,這會破壞一個功能的消費者與該功能的提供者之間的完全隔離,這是接口所提供的。

0

覆蓋是使用繼承時可用的功能。

當從另一個類擴展的類想要使用父類的大部分功能並希望在某些情況下實現特定功能時使用它。

在這種情況下,我們可以創建具有與父類相同的名稱和簽名的方法。這種方法掩蓋了父方法的新方法,並且默認情況下會被調用。

1

爲什麼不能我們寫一個不同名稱的新方法和使用該方法

這是因爲我們想用多態性。你可以告訴面試官這個例子:有一個模塊調用特定的方法對你給它的對象;現在想象你不能改變那個模塊(例如沒有源代碼)。你不能告訴它使用不同的方法,但你可以給它一個覆蓋該方法的子類的對象。對模塊來說,它看起來沒有任何改變。

在實踐中,往往也是你可以改變模塊,但不希望的情況。

0

壓倒一切的主要目的是代碼reuseablity這在大項目advatageous,它也提供了flexiblity意味着你可以從任何一類通過不同組輸入和獲得輸出

相關問題