类方法的Virtual,有什么具体的运用

justoday 2011-08-27 04:08:45
unit Unit1;

interface

type

TClassA = class

protected
class var
F1 : Integer;
F2 : integer;

class Procedure Proce1; virtual; abstract;
class Procedure Proce2; virtual; abstract;
public
class constructor ClassCreate;
end;

TClassB = class(TClassA)
protected
class Procedure Proce1; override;
class Procedure Proce2; override;
end;

implementation



{ TClassA }

class constructor TClassA.ClassCreate;
begin


Proce1; // Proce1 是 virtual; abstract; 本意是想调用子类的实现
Proce2; // Proce2 是 virtual; abstract; 本意是想调用子类的实现

end;

{ TClassAA }

class procedure TClassB.Proce1;
begin
F1 := 10;
end;

class procedure TClassB.Proce2;
begin
F2 := 100 div F1
end;
end.
{
结果是运行出错,根本不会去调用TClassB 对应的过程,
只会调用TClassA 的对应过程,面TClassA里这两个方法都是abstract

因为 Proce1 必须先于Proce2 调用,
所以用类似模板方法的思想实现,在父类里因定好调用顺序,子类里具体实现


类方法的Virtual,有什么意义,有什么具体的运用。
}

...全文
264 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
justoday 2011-09-01
  • 打赏
  • 举报
回复
Delphi 类方法的virtual,设计的不是太严谨
象这样 class procedure Pro1; virtual; abstract;
子类没有提供override,编译也能通过

以此看来,我上面的例子里面,直接去调有abstract的方法(而不是子类的方法)也不足为怪
justoday 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zwjchina 的回复:]
Delphi(Pascal) code

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button……
[/Quote]

估计也就是给元类变量这样用了。我也是用元类变量解决我的运用。。。

zwjchina 2011-09-01
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TBaseClass = class
public
class procedure ClassFun; virtual;
end;

TBClass2 = class(TBaseClass)
public
class procedure ClassFun; override;
end;

TBClass3 = class(TBaseClass)
public
class procedure ClassFun; override;
end;

TClassRef = class of TBaseClass;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
c: TClassRef;
begin
ShowMessage('Call TBClass2 >>>');
c := TBClass2;
c.ClassFun;
//TBClass2.ClassFun;

ShowMessage('Call TBClass3 >>>');
c := TBClass3;
c.ClassFun;
end;

{ TBaseClass }

class procedure TBaseClass.ClassFun;
begin
ShowMessage('TBaseClass');
end;

{ TBClass2 }

class procedure TBClass2.ClassFun;
begin
inherited;
ShowMessage('TBClass2');
end;

{ TBClass3 }

class procedure TBClass3.ClassFun;
begin
inherited;
ShowMessage('TBClass3');
end;

end.

funxu 2011-08-31
  • 打赏
  • 举报
回复
class procedure 类方法 就是static方法,本身是与类绑定而不是对象,所以他不能是虚方法或者抽象方法
justoday 2011-08-29
  • 打赏
  • 举报
回复
class constructor TClassA.ClassCreate;
begin


Proce1; // Proce1 是 virtual; abstract; 本意是想调用子类的实现
Proce2; // Proce2 是 virtual; abstract; 本意是想调用子类的实现

end;


其实,这里要调用到子类的实现,不太实际。虽然我这里是希要这个功能
justoday 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 truexf 的回复:]
结果是运行出错,根本不会去调用TClassB 对应的过程,
--------------
不可能。这个代码就是典型的多态示例。没啥奇怪的。
[/Quote]


大哥,麻烦您看清楚!!要不你试一下这个代码,,,

class Procedure Proce1; virtual; abstract;


前面加了个"class" ,如果不加这个class,如您所说
justoday 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jekhn 的回复:]
类方法定义成虚拟方法,没见过这样用的。
[/Quote]

是啊,我也觉得这样定义没有实际意义,,,,但Delphi确实支持这么定义,
更要命的是,它会直接调用 abstract 的方法
「已注销」 2011-08-28
  • 打赏
  • 举报
回复
结果是运行出错,根本不会去调用TClassB 对应的过程,
--------------
不可能。这个代码就是典型的多态示例。没啥奇怪的。
「已注销」 2011-08-28
  • 打赏
  • 举报
回复
为什么实现不了多态。你的代码就是多态的例子。
Jekhn 2011-08-27
  • 打赏
  • 举报
回复
类方法定义成虚拟方法,没见过这样用的。
justoday 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
virtual是虚函数,多态时应用
[/Quote]

我的意思就是“《类》方法”的virtual,在这种状况下,实现不了多态
justoday 2011-08-27
  • 打赏
  • 举报
回复
类方法的Virtual,,,我之所以说它没有什么意义,是因为按上面这么写,它根本就不去试用子类OVERRIDE 的方法

请问,有什么办法调用到子类OVERRIDE 的CLASS PROCEDURE ,
justoday 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
virtual是虚函数,多态时应用
[/Quote]

可能我表术不清

我是说像 class Procedure Proce1; ,,,,,后面加virtual,它有意义吗?
您有空试一下上面的代码,看看能不能为这种应用提供一些建议
bdmh 2011-08-27
  • 打赏
  • 举报
回复
virtual是虚函数,多态时应用

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧