物件的多種形態
辛巴是獅子;
辛巴是動物。
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...