我正在编写一个包含一些虚拟/抽象过程的类,希望能被重写。但是,它们也可能不会被覆盖,这也很好。问题是找出这些过程之一是否被实际覆盖。如果它们没有被覆盖,我不应该尝试调用这些过程,而需要做一些不同的事情。如果我尝试调用其中一个并且没有被覆盖,则会得到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

07-28 07:40