在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/2660555.html 对象的方法能定义成静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)。请看下面 TFoo = class 1. 静态方法 2. 虚拟方法 3. 动态方法 4. 消息处理方法 5. 方法的覆盖 TFooChild = class(TFoo) 用了override关键字后,编译器就会用新的方法替换VMT中原先的方法。如果用virtual或dynamic替换 6. 方法的重载 type 7. 重新引入方法名称 8. Self virtual, dynamic: 虚拟方法和动态方法, 在语义上是等价的, 只是前者是时间最优,后者是空间 override 重载,实现多态。实现或覆盖virtual, dynamic, abstract的声明 stdcall 使用标准的win32参数传递技术. 其他如register,cdecl,pascal message 消息处理 (reintroduce表示是重新声明的方法;用于方法的名称与祖先类中的某个方法名称相同的情形)
//---------------------http://bbs.csdn.net/topics/220062579 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; //夫类,抽象类 TParent = class protected function MyFun(i: Integer): Integer; virtual; abstract; //抽象方法(纯虚方法),只有定义没有实现,一个类包含一个即成抽象类,抽象类不能直接创建对象。 end; //子类 TChild = class(TParent) protected function MyFun(i: Integer): Integer; override; //覆盖 end; var Form1: TForm1; implementation {$R *.dfm} { TChild } function TChild.MyFun(i: Integer): Integer; begin Inc(i); Result := i; end; //测试 procedure TForm1.FormCreate(Sender: TObject); var p: TParent; c: TChild; begin p := TChild.Create; //抽象类只能通过其子类创建对象 c := TChild.Create; ShowMessage(IntToStr(p.MyFun(2))); //3 ShowMessage(IntToStr(c.MyFun(2))); //3 p.Free; c.Free; end; end. 小结:delphi中有abstract的就叫纯虚方法,就是抽象类。而abstract必须定义在 virtual、dynamic 之后。 没有abstract定义的virtual、dynamic的方法不一定是纯虚的,因为他们可以实现自己的东西。 接口的方法就是纯虚方法(默认的)。 发现:接口中的方法定义为procedure 在实现类中却可以写成function 可以有返回值,只要名字相同即可编译通过,偶然发现。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论