最常見的是,當我們談論OOP時,術語polymorphism
用於描述對象在使用繼承時的行爲,所以我們可以使用子類型的對象,就好像存在基類的對象一樣(這些對象的亞型變得多態,它們有兩種形式 - 自己的類型和基類的類型)。
例如,如果我們有一個代表整數對象和實數的層次,我們有基礎Number
類:
Number
/ \
/ \
/ \
Integer Real
每個類都定義自己的一套操作,例如add
和multiply
。現在,我們可以使用Integer
兩個類型的object
作爲Integer
並作爲Number
(同爲Real
和Complex
) - 所以這個對象是多態,它可以代表兩種(類):
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.
另外polymorphism
can be used to describe通用函數/類(模板)。
您是否嘗試過搜索現有問題?我相信他們已經覆蓋了這個?也就是說,* Polymorphism *是一個寬泛的概念,但是* Polymorphic *面向對象代碼最重要的方面是它允許一個對象屬於多個類型。 – CKing
我明白多態性'允許一個對象屬於多種類型'。所有這一切都是通過編寫多態方法實現的(什麼是沒有定義任何方法的類(我的意思是一個空白類))。所以我的觀點是多態是通過編寫多態方法來實現的。 – linuxWiz89
@ linuxWiz98這就是你似乎出錯的地方。 *多態*替代不是通過覆蓋來實現的。 *多態*替換通過*繼承*(類擴展)來實現。不需要*重寫*子類中的方法來利用* Polymorphism *。如果'A'是一個具有'doSomething'方法並且'B extends A'的類,那麼'A'類型的引用可以指代'A'和'B'實例,而不需要*覆蓋*在'B'中做'東西'。現在,如果我們談論運行時多態,那麼您可以真正開始討論重寫方法。 – CKing