delphi 的虚方法 和 动态方法有什么区别吗?
请大侠门说说
delphi虚方法和动态方法有什么用?
一般什么时候用啊?
谢谢大家
请大侠门说说
delphi虚方法和动态方法有什么用?
一般什么时候用啊?
谢谢大家
解决方案 »
- 请教一下,char类型的储存长度?
- HELP!~~~IdTCPServer做服务器遇到问题了!
- 兄弟们有个FASTREPORT的小问题问大家一下,拜托!摆脱!!!
- 如何知道一个程序中有多少个FORM????急,急,在线等.....
- 新手请教:如何撤销前面一个操作。
- 我怎么可以模拟按下其它程序上的按钮。如影音传送带中的“新建”和“确定(&O)”按钮?
- 请教大家:关于如何实现应用程序服务器的pooling、Apartment Model功能?? 看过李维分布式书籍或Delphi下的Pooler Demo的朋友请帮忙。。
- string如何转化为TFieldType?
- 急急急!关于ado操作的问题,在线等待,
- 关于delphi的opengl控件,哪里可以下载?一定送分!!!
- win7下SQL SERVER2005速度慢
- 请教多语言问题 .rc的文件是怎么自动生成的
因为类一般是存在于一个继承链中, 所以就有了一些新的概念, 譬如: 继承、覆盖;
也有了很多新名称, 譬如: 静态方法、虚方法、动态方法、抽象方法、类方法、消息方法.先从虚方法与动态方法开始吧
--------------------------------------------------------------------------------//下面的类中就定义了两个虚方法(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;{正是因为这种机制而形成了多态}
--------------------------------------------------------------------------------//那虚方法和动态方法有什么区别呢?
13.8px">
每个类都内含着两个表: 虚方法表(VMT)和动态方法表(DMT);
VMT 表包含着本类与其所有父类的虚方法 - 那一般会是一个比较庞大的表;
DMT 表只包含本类的动态方法 - 如果要调用其上层类的动态方法, 只能逐级查找;
因此, 使用虚方法速度上会有优势, 使用动态方法会节约内存;
在 Delphi 初期只有 virtual 而没有 dynamic ; 后来随着 VCL 日渐庞大, 才有了 dynamic ;
譬如类的事件方法一般都是在早期定义, 为了节约空间, 事件方法在 VCL 中基本都定义成了 dynamic ;
这样看来: virtual 和 dynamic 并没有太多区别, 一个侧重速度、一个节约空间; 它们是可以互相代替的!
另外: 因为它们区别不大, 并且是先有 virtual , 所以人们也习惯于把"虚方法"和"动态方法"都称作"虚方法".以上来之万一的博客
procedure Test(Sender: TObject);virtual;的事件,然后你的子窗体可以通过
procedure Test(Sender: TObject);override;对父窗体的Test事件进行重写。
procedure Test(Sender: TObject);override;
begin
inherited;//子窗体的重写代码中加上这个则表示仍继承父窗体的Test事件,删除则表示不继承。
end;
就可以把此方法写在父窗体中,声明为virtual;或者dynamic;那么这100个子窗体就可以不写一行代码了
有一天某个子窗体要做改动时,用override就可以覆盖此方法,在自己的单元里重写此方法,很方便
看4L