delphi virtual dynamic
dynamic就是它是動態(tài)方法,沒有靜態(tài)地址,所以速度慢一點(diǎn)
virtual是虛方法,如果在基類中不聲明成虛方法的話,繼承后,該方法會提示一警告信息,把基類中方法屏蔽掉了
---------------------------------------------------------------
動態(tài)(Dynamic)和虛擬(Virtual)后都可以使用Override關(guān)鍵字在派生類中對對應(yīng)方法進(jìn)行覆蓋從而實(shí)現(xiàn)多態(tài)......
虛擬方法和動態(tài)方法在語義上可以說是等價(jià)的,他們唯一的區(qū)別在于對方法調(diào)用策略的內(nèi)部實(shí)現(xiàn)上:虛擬方法從速度最優(yōu)化的角度實(shí)現(xiàn)代碼優(yōu)化,而動態(tài)方法則是從空間最優(yōu)的角度實(shí)現(xiàn)代碼優(yōu)化......
被覆蓋的動態(tài)方法在派生類的VMT中不再出現(xiàn)........所以節(jié)省空間........但查詢速度慢
被覆蓋的虛擬方法在怕生類的VMT中再次出現(xiàn)........所以查詢速度快......但浪費(fèi)空間
---------------------------------------------------------------
虛擬方法和動態(tài)方法
?
要使一個方法成為虛擬的或動態(tài)的,需要在其聲明中包括指示字virtual或dynamic。虛擬方法和動態(tài)方法不同于靜態(tài)方法,它們可以在其后裔類中被覆蓋(overridden)。當(dāng)一個覆蓋方法被調(diào)用時,方法調(diào)用中使用的類或?qū)ο蟮膶?shí)際(運(yùn)行時)類型決定了哪一個實(shí)現(xiàn)是有效的,而非變量聲明的類型決定。
要覆蓋一個方法,需要在再聲明中使用指示字override。一個override聲明必需與其祖先聲明在參數(shù)順序和類型以及結(jié)果(如果有)等各方面匹配。
下面的例子中,TFigure中聲明的Draw方法在兩個后裔類中都被覆蓋。
type
? TFigure = class
??? procedure Draw; virtual;
? end;
? TRectangle = class(TFigure)
??? procedure Draw; override;
? end;
? TEllipse = class(TFigure)
??? procedure Draw; override;
? end;
對于上面給出的聲明,下面的代碼舉例說明了在運(yùn)行時通過一個變量調(diào)用虛擬方法時,其類型變化的效果。
var
? Figure: TFigure;
begin
? Figure := TRectangle.Create;
? Figure.Draw;? //調(diào)用的是TRectangle.Draw
? Figure.Destroy;
? Figure := TEllipse.Create;
? Figure.Draw;? //調(diào)用的是TEllipse.Draw
? Figure.Destroy;
end;
只有虛擬方法和動態(tài)方法可以被覆蓋。然而,所有的方法都可以被重載(overloaded),見重載方法。
虛擬和動態(tài)
虛擬方法和動態(tài)方法在語義上是等價(jià)的。其不同之處僅在于運(yùn)行時對方法調(diào)用如何實(shí)現(xiàn)調(diào)度。
虛擬方法在速度方面相對更優(yōu)化,而動態(tài)方法在代碼尺寸方面相對更優(yōu)化。
一般情況下,虛擬方法是實(shí)現(xiàn)多種行為最有效的途徑。當(dāng)一個基本類聲明了許多可覆蓋的方法,并且在應(yīng)用程序中將被許多后裔類繼承但很少覆蓋時,動態(tài)方法是有用的。?
本文來自Delphi之窗,原文地址:http://www.52delphi.com
總結(jié)
以上是生活随笔為你收集整理的delphi virtual dynamic的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS调用后台带参数的方法
- 下一篇: 《大数据》第1期“论坛”——对大数据国家