我在实现接口的类中创建了一个类方法,但似乎无法在接口内部定义它。
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。