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

如何在Delphi中支持接口定义中的类方法,delphi,oop,interface,Delphi,Oop,Interface,我在实现接口的类中创建了一个类方法,但似乎无法在接口内部定义它 IMyClass = interface procedure someproc(); class function myfunc() : TMyClass; // compiler doesn't like this! end; TMyClass = class( TInterfacedObject, IMyClass ) public procedure someproc(); class function m

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

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(), ... );
创建
TMyClass
的实例并将其传递到
somefunc

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

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

如果没有直接支持,您如何做


(我正在使用Delphi XE5,以防万一。)

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


您要查找的内容很可能必须作为类工厂实现,而不是使用接口。

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

您试图实现的是不可能的,因为它违反了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;
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
说明符删除我们不需要的隐藏参数(class vtable pointer),并明确地添加实例指针参数;但是编译器确实支持这样的语法,因为上面的语法与更简单的语法基本相同

IMyClass = interface
  procedure someproc();
  function myfunc(): TMyClass;
end;

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

使用实例方法而不是类方法实现接口方法它作为实例方法工作,但它需要实例而不是类。没错。您需要一个实例来实现一个接口。我已经阅读了一些Java8特性,它们现在包括在接口中定义静态成员(Delphi类方法)的方法。我想知道在Delphi中是否有任何方法可以做到这一点。Delphi接口是COM接口,并且受COM的实现细节的约束。David没有试图在接口中定义类方法。他试图用类方法实现一个接口方法。好吧,如果接口中支持类方法会有变化,那么可以安全地假设二进制表示将发生变化,从而使之成为可能。