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