如何在Delphi中支持接口定义中的类方法



我在实现接口的类中创建了一个类方法,但似乎无法在接口内部定义它。

IMyClass = interface
  procedure someproc();
  class function myfunc() : TMyClass;  // compiler doesn't like this!
end;
TMyClass = class( TInterfacedObject, IMyClass )
public
  procedure someproc();
  class function myfunc() : TMyClass;
end;

我希望myfunc()创建并返回TMyClass的实例。例如:

somefunc( TMyClass.myfunc(), ... );

创建CCD_ 3的实例并将其传递到CCD_。

我可以在IMyClass接口中定义function myfunc() : TMyClass;,但如果我把class放在它前面,编译器会给我一个错误。如果我忽略它,它会给我其他几个错误"E2291缺少接口方法xyz.myfunc的实现"它只是不接受接口中与类中相同的签名。

我想我以前见过这种工作(在接口中定义的类方法),但可能没有。

如果这不是直接支持的,你该怎么做?

(我使用的是Delphi XE5,以防万一。)

接口不是类,不支持标记为class的方法,它们只支持在对象实例上实现和调用的非class方法。

您正在寻找的东西很可能必须作为类工厂来实现,而不是使用接口。

您想要实现的是不可能的,因为它违反了Delphi接口的二进制规范。

Delphi中的任何接口方法都隐藏了指向实例的第一个参数指针。实例方法具有相同的隐藏参数(Self,指向实例的相同指针),因此它们与接口方法是二进制兼容的。

另一方面,类方法的隐藏参数是指向类vtable的指针,因此Delphi类方法是二进制的,与Delphi接口方法不兼容。

假设您可以想到以下(二进制兼容)声明:

IMyClass = interface
  procedure someproc();
  function myfunc(): TMyClass;
end;
TMyClass = class( TInterfacedObject, IMyClass )
public
  procedure someproc();
  class function myfunc(Inst: TMyClass) : TMyClass; static;
end;

这里我使用static说明符来删除我们不需要的隐藏参数(类vtable指针),并显式添加实例指针参数;但编译器确实支持这样的语法,因为上面的语法基本上与更简单的相同

IMyClass = interface
  procedure someproc();
  function myfunc(): TMyClass;
end;
TMyClass = class( TInterfacedObject, IMyClass )
public
  procedure someproc();
  function myfunc() : TMyClass;
end;

您可以在类定义(TMyClass)中定义类方法(Delphi中的类过程),但不能在接口(IMyClass。

最新更新