您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi检测对象有方法时是否为纯虚函数(4)

时间:2011/9/3 15:37:10 点击:

我的Win2000 Server, Delphi6
暂时算是任意过程好使了
 if not IsAbstract(@TExample.VirtualMethod) then
    T.VirtualMethod;

  if not IsAbstract(@TExample.AbstractMethod) then
      T.AbstractMethod;
不知想法是否对?
用@的方法是可取的,但有些场合也不能用,这不是解决问题的最好方法。此外,你的说法
里很有一些语病。回头再细细地写给你看。
你对revendepro的了解是有一些错误的,它的确是一个不错的反编译工具,但它的突出之
处在于RTTI的分析和一个DisAsm.pas单元上,而对本例中的问题,它的源码是没有答案的。
我分析revendepro也有一定的时间了,它的源码我大概读了1/4。此外,我没有在什么论坛
上看到过有关本问题的一些思路,因此才提出来。
今天要解决我在DelphiBBS上的一些历史贴子,暂时没时间来处理本问题,所以文章要等到
明天才可能贴出来。不过还是欢迎大家讨论。
象xzgyb的想法就比较有建树。:)
>>@TExample.AbstractMethod
  好像有问题喲——在程序中,你得到的只是对象,而它的Class信息并不能做类似
@e.ClassType.abstractMethod 之类的操作,只有一个MethodAddress可以用,并且只能用于
published方法。
我试的@TExample.AbstractMethod时返回的
JMP @AbstractError这条指令的地址阿
  我们想的不一样——如果可以直接使用 @TExample.AbstractMethod,何不在编译之前就直接把
所有纯虚调用的代码删掉——反正执行的时候没有多态的问题——已经定死了TExample了,派生类
还有机会吗?
procedure TForm1.Button4Click(Sender: TObject);
var
  Obj:TSubExample;
begin
  Obj:=TSubExample.Create;
  Obj.DoMethod;
  Obj.Free;
end;
DelphiCode: 
type
  TExample=class
    procedure abstractMethod;virtual; abstract;
    procedure DoMethod;
  end;
  TSubExample=class(TExample)
    procedure abstractMethod; override;
  end;

{ TExample }

procedure TExample.DoMethod;
begin
  //do something else...
  abstractMethod; //在这里如何判断?
end;

{ TSubExample }

procedure TSubExample.abstractMethod;
begin
  ShowMessage('123');
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Obj:TExample;
begin
  Obj:=TExample.Create;
  Obj.DoMethod;
  Obj.Free;
end;

上一页1234下一页

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号