我正在编写一个包含一些虚拟/抽象过程的类,希望能被重写。但是,它们也可能不会被覆盖,这也很好。问题是找出这些过程之一是否被实际覆盖。如果它们没有被覆盖,我不应该尝试调用这些过程,而需要做一些不同的事情。如果我尝试调用其中一个并且没有被覆盖,则会得到Abstract Error
。
有什么方法可以检测这些程序是否被覆盖?
以下是如何声明它们的示例:
type
TMyClass = class(TObject)
protected
procedure VProc; virtual;
procedure VAProc; virtual; abstract;
end;
最佳答案
你可以做这样的事情。请注意,我已删除“抽象”。它可能与“抽象”一起使用,但是我还没有尝试过。
type
TMyClass = class(TObject)
protected
procedure VProc; virtual;
procedure VAProc; virtual; //abstract;
end;
function GetVAProcAddress(Instance: TMyClass): pointer;
var
p: procedure of object;
begin
p := Instance.VAProc;
result := TMethod(p).Code;
end;
//in one of the TMyClass methods you can now write:
if GetVAProcAddress(self) <> @TMyClass.VAProc then