2017-10-28 281 views
1

我想了解更多關於oop中的多態性有一個主題與任何特定語言(C++,java,python)無關。 我想了解和理解它的真實形式(留下語言的偶像)的多態性。多態方法或類

背景: 我在電話採訪中被問到解釋多態性? 我的答案:多態性與方法有關,通過重載(靜態綁定)和覆蓋(動態綁定)來實現。解釋超載和重寫之間的差異

面試官的回答是我錯了,多態性與類而不是方法有關。我強烈反對,但這個人是科技主管和哥倫比亞大學計算機科學學士學位(大約15 - 20年的經驗)的畢業生,我來自一所擁有計算機科學學士學位的州立大學(< 4年經驗)

+0

您是否嘗試過搜索現有問題?我相信他們已經覆蓋了這個?也就是說,* Polymorphism *是一個寬泛的概念,但是* Polymorphic *面向對象代碼最重要的方面是它允許一個對象屬於多個類型。 – CKing

+0

我明白多態性'允許一個對象屬於多種類型'。所有這一切都是通過編寫多態方法實現的(什麼是沒有定義任何方法的類(我的意思是一個空白類))。所以我的觀點是多態是通過編寫多態方法來實現的。 – linuxWiz89

+1

@ linuxWiz98這就是你似乎出錯的地方。 *多態*替代不是通過覆蓋來實現的。 *多態*替換通過*繼承*(類擴展)來實現。不需要*重寫*子類中的方法來利用* Polymorphism *。如果'A'是一個具有'doSomething'方法並且'B extends A'的類,那麼'A'類型的引用可以指代'A'和'B'實例,而不需要*覆蓋*在'B'中做'東西'。現在,如果我們談論運行時多態,那麼您可以真正開始討論重寫方法。 – CKing

回答

0

最常見的是,當我們談論OOP時,術語polymorphism用於描述對象在使用繼承時的行爲,所以我們可以使用子類型的對象,就好像存在基類的對象一樣(這些對象的亞型變得多態,它們有兩種形式 - 自己的類型和基類的類型)。

例如,如果我們有一個代表整數對象和實數的層次,我們有基礎Number類:

  Number 
     / \ 
    /  \ 
    /  \ 
    Integer  Real 

每個類都定義自己的一套操作,例如addmultiply。現在,我們可以使用Integer兩個類型的object作爲Integer並作爲Number(同爲RealComplex) - 所以這個對象是多態,它可以代表兩種(類):

n1 = Integer(...) 
n2 = Integer(...) 
r = Real(...) 

// Now we can have a function that takes advantage of the 
// polymorphic behavior, notice that it takes `Number` as 
// argument types, so it doesn't know what are actual types 

function f(x: Number, y: Number) { 
    // here we don't know if x and y are integer or real 
    return x.multiply(x).add(y); // x*x + y 
} 

Number result1 = f(n1, n2) // here we also don't know the specific 
Number result2 = f(n2, r) // type of the result 

這就是點subtype polymorphism,現在我們可以定義更多數量的子類型(例如,具有更好的浮點精度的實數類型,但處理速度較慢)。同時f函數將保持原樣,因爲它不依賴於特定的類型。

注意polymorphism也可以用來描述功能的行爲,例如,當我們宣佈與名稱相同,但不同的參數和編譯器的功能選擇在特定情況下(例如,從wikipedia)要使用的實現:

function Add(x, y : Integer) : Integer; 
begin 
    Add := x + y 
end; 

function Add(s, t : String) : String; 
begin 
    Add := Concat(s, t) 
end; 

begin 
    Writeln(Add(1, 2));     (* Prints "3"    *) 
    Writeln(Add('Hello, ', 'World!')); (* Prints "Hello, World!" *) 
end. 

另外polymorphismcan be used to describe通用函數/類(模板)。