C 物件導向(三)多型

2021-07-23 10:57:22 字數 2131 閱讀 8088

物件的多種形態

辛巴是獅子;

辛巴是動物。

animal xinba = new lion();

行為的多種形態

同樣的行為,但是表現形式不同。也就是說方法簽名一樣,方法體不同。(簽名在這裡指的是方法名、引數以及返回值)

行為的多型體現為方法的重寫、隱藏、過載

隱藏是實現多型的基本方法之一。

class

program

}class

animal

}class

lion:animal

}

該程式輸出:
animal

lion

animal

方法隱藏不能夠實現父類呼叫子類

方法重寫解決父類所定義方法在子類中不適用(虛方法),

或父類沒有實現(抽象方法),這樣的方法子類可以重寫,

重寫是為了滿足子類對該方法的不同需求.

1. 虛方法重寫

virtual 方法在子類可以重寫,父類方法的做法與子類不同
2. 抽象方法重寫=抽象方法的實現
abstract 方法在子類必須重寫,除非子類也是抽象類
3. 重寫方法的重寫 (重寫方法被標識為sealed不能再被重寫了)
已經重寫過的方法,在子類還可以繼續重寫,除非被標識為sealed
定義: 用vritual關鍵修飾的已經實現的方法,即是虛方法 。

特點: 虛方法表示乙個可以在子類中重寫的方法。

class

program

}class

animal

}class

lion:animal

}

輸出結果
animal

lion

lion

虛方法可以實現父類呼叫子類

比較隱藏和重寫

共性:都是多型實現的基本方式

不同:1. 實際應用中 隱藏很少用【可以實現選擇性的復用,不能父調子】 重寫用的多【可以實現選擇性的復用,能父調子】需求多

2. 實現原理不同,隱藏的效能高於重寫。

3. 隱藏是靜態繫結,效能高,快,不靈活;重寫是動態繫結,效能低,慢,靈活。

方法隱藏的原理
方法隱藏是子類的方法表加入乙個新項,

新項中表示的方法簽名與繼承來的方法簽名一致,

但是在方法表中不能出現相同簽名的方法項,

所以必須要隱藏掉乙個。

子類用新項隱藏舊項。方法隱藏是在方法表加新項

方法重寫的原理
父類的方法在子類重寫後,

是子型別將方法表中相應方法簽名對應的方法所在的位址重寫了,

重寫後,原方法簽名項關聯到新方法的位址。

當引用呼叫該方法時,訪問新位址中的方法。

所以方法重寫後,不管是通過父類還是子型別的引用,

呼叫方法時,都呼叫物件真實型別中定義的方法

如:a是父類,b是子類,a中show方法在子類中重寫

a obj = new b(); //a型別引用指向b型別的物件

obj.show();

此時呼叫的是b型別定義的show方法.

定義:抽象類表示乙個抽象概念,

在c#語法,指的就是用abstract修飾的類即為抽象類

特點:

1. 可以被繼承,不能例項化(抽象類不能建立物件 new 抽象類自己)。

2. 抽象類中可能包含抽象成員(方法,屬性),可以有也可以沒有(空)。

定義:只要宣告沒有實現的方法,就是抽象方法。

特點:抽象方法必須放在抽象類或者介面中。

抽象類中的抽象方法必須使用abstract修飾符

比較抽象類中的抽象方法和虛方法

1   虛方法:virtua1修飾的已經實現的方法

可以重寫也可以不重寫

2 抽象方法:沒有實現的方法

在實現類(子類 普通的類)中必須實現【重寫】

物件導向(三) 多型

多型是物件導向三大特性中比較難理解的乙個概念,但並不複雜!在這裡介紹下有關多型的概念以及相關用法。多型可以理解為對於同乙個方法,根據不同的物件產生不同的結果。光說肯定很抽象,下面用個例子去解釋多型。例子 package com.zzl.polymorphism public class polymo...

LUA物件導向程式設計(三)多型

先來了解一下多型的概念。在物件導向語言中,多型本質就是執行時繫結,比如有乙個父類baseclass,它有2個子類subclass1,subclass2。baseclass有乙個方法func 兩個子類都重寫了這個方法。那麼我們可以定義乙個baseclass的引用obj,讓它指向乙個子類的物件,比如ba...

Python物件導向的特點(三)多型

在物件導向程式設計中,不同的子類物件呼叫相同的父類方法,產生不同的執行結果 示例 需求 定義狗類和人類,要求普通的狗類開心的玩耍,特殊的狗類和公尺老鼠玩耍。class dog object def init self,name self.name name def game self print s...