我的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下一页