虚方法与动态方法
| 虛方法與動態方法 | |
| ? | |
方法來到類中, 以前的特點基本都在;
因為類一般是存在于一個繼承鏈中, 所以就有了一些新的概念, 譬如: 繼承、覆蓋;
也有了很多新名稱, 譬如: 靜態方法、虛方法、動態方法、抽象方法、類方法、消息方法.
先從虛方法與動態方法開始吧
--------------------------------------------------------------------------------
//下面的類中就定義了兩個虛方法(virtual)、兩個動態方法(dynamic)
TMyClass = class
procedure Proc1(x,y: Real); virtual;
function Fun1(x,y: Real): Real; virtual;
procedure Proc2(x,y: Real); dynamic;
function Fun2(x,y: Real): Real; dynamic;
end;
--------------------------------------------------------------------------------
//定義成虛方法或動態方法, 就意味著在后來的子類中將要被覆蓋(override), 也就是重寫
TBass = class
procedure Proc(x,y: Real); virtual;
function Fun(x,y: Real): Real; dynamic;
end;
TChild = class(TBass)
procedure Proc(x,y: Real); override;
function Fun(x,y: Real): Real; override;
end;
{正是因為這種機制而形成了多態}
--------------------------------------------------------------------------------
//那虛方法和動態方法有什么區別呢?
每個類都內含著兩個表: 虛方法表(VMT)和動態方法表(DMT);
VMT 表包含著本類與其所有父類的虛方法 - 那一般會是一個比較龐大的表;
DMT 表只包含本類的動態方法 - 如果要調用其上層類的動態方法, 只能逐級查找;
因此, 使用虛方法速度上會有優勢, 使用動態方法會節約內存;
在 Delphi 初期只有 virtual 而沒有 dynamic ; 后來隨著 VCL 日漸龐大, 才有了 dynamic ;
譬如類的事件方法一般都是在早期定義, 為了節約空間, 事件方法在 VCL 中基本都定義成了 dynamic ;
這樣看來: virtual 和 dynamic 并沒有太多區別, 一個側重速度、一個節約空間; 它們是可以互相代替的!
另外: 因為它們區別不大, 并且是先有 virtual , 所以人們也習慣于把"虛方法"和"動態方法"都稱作"虛方法".
總結
- 上一篇: 只能是做的HTML5审批流项目
- 下一篇: 飞鸽传书不少团队都配置了专门的需求分析的