那位高手解释一下DELPHI是的abstract,virtual,dynamic方法。 (100分)

  • 主题发起人 主题发起人 andykwok
  • 开始时间 开始时间
A

andykwok

Unregistered / Unconfirmed
GUEST, unregistred user!
我是一个DELPHI的小学生:),在编写构件的时候对上述的三种方法有很多的疑问,
有哪位高手可以指点小弟一下。万分感谢。
 
找到了一些文章中有相关的解,但还是不太清楚,内容如下:
静态方法(Static Methods)
当你不希望某个method被子类别改写(Override)的话,可以将它宣告为静态方法。
虚拟/动态方法(Virtual/Dynamic Methods)
当你预期某个Methd会被子类别改写的话,应将它宣告为Virtual。而Dynamic的使用
时机是当一个类有很多子类别的时候,例如一个类别有100个子类别,而这些子类别
都会用到某个Method,但很少会去改写它,那这个Method就应该被宣告为Dynamic以
节省内存。
抽象方法(Abstract Methods)
抽象方法应该只被用于抽象类别中,它们主要是用来定我基础类别的介面。
 
andykwok说的很好,愚人以为它们,特别是静态方法和动态方法间的区别在方法的索引
方式和内存占用上,具体关系到执行效率上有所区别。
具体详细内容请查阅有关书籍。
 
同意楼上说的。另外抽象方法所在的类是抽象类,不能产生实例,必须有子类继承,对父类
的抽象方法覆盖。虚拟方法和动态方法之间的区别主要在内存分配上和功能实现的机制不太
一样,又虚拟方法表和动态方法表。各有优缺点。
 
abstract class和interface是语言中对于抽象类定义进行支持的两种机制,
正是由于这两种机制的存在,才赋予了强大的面向对象能力。
abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,
甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class
和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,
对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、
合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间
进行选择的依据。


 
同意楼上两位的看法,不过对于老人家的解释,因小弟才疏学浅,尚不能完全理解,
期待您老人家的进一步剖析。
 
TO:老人家
可以把文章其它的內容貼上來嗎?
 
留下你的qq和mail
 
哥们看tourb c++ 吧。
 
我也说上两句,我的理解是
静态方法:后代类只能覆盖祖先的同名方法,不能再引用祖先的同名方法;
virtual(虚拟方法)和dynamic(动态方法):后代类可以override祖先的同名方法,在
override过程的实现里还可以用inherited调用祖先的同名方法,两者的差异在于方法指针的
保存,virtual方法使用VMT(Virtual Method Table),也就是说,每一个该类的后代类都拥
有整个的VMT,其优点在于速度快,因为类的实例可以直接从VMT中找到该方法的入口,但它
也耗用较多的内存;相对的dynamic方法则不使用VMT,如果类的后代没有override该方法,
那么需要从它的父类去查找方法的入口,它的优点是少用内存,因为子类只保留它override
的方法入口,缺点是速度较慢,尤其在多级继承的时候,可能需要前溯好多层才找到方法的。
一般的理解是,如果该方法其后代类基本都需要override的,使用virtual,如果该方法不经
常在后代类中被override的,使用dynamic。
abstract(抽象方法),抽象方法是指该类只定义了方法的名字,但没有实现方法的部分,方
法又其后代类去实现,含有抽象方法的类不能被实例化!
 
abstract的方法必须是必须virtual,dynamic的表示这个类一定有这样的方法,但具体如何实现
油继承自他的子类来实现。
virtual和dynamic再使用上没有分别。但在程序内部实现上不同。
virtual具有时间优势,而dynamic具有空间优势。
virtual,dynamic的方法都可以由子类来覆盖(override)。



 
To wr960204: override 好象叫“重载”,不叫“覆盖”,后代类对祖先类的静态方法使用
的是“覆盖”,而对virtual或dynamic方法使用的是override(重载),重载方法通常在实
现部分使用 inherited 来重新调用祖先的方法的,例如最常见的是:
TMyComponent = class(TComponent)
...
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner); // 这里首先调用祖先的构造方法
... // 自己添加的构造部分
end;
destructor TMyComponent.Destroy;
begin
... // 首先释放自己附加的资源
inherited Destroy; // 调用祖先的释放方法
end;
 
to SupermanTm,那么OverLoad叫什么呢?还叫重载?
我理解Override应该叫覆盖.再覆盖时你可以继承原来的方法.
有些书把Override和Overload都翻译成重载.我认为是不准确的,虽然内部机制类似.
 
还是重载专业些
 
多人接受答案了。
 
后退
顶部