我有一个界面和相应的对象。例如......
IMyInterface = interface
function GetSomething: WideString;
procedure SetSomething(const Value: WideString);
property Something: WideString read GetSomething write SetSomething
end;
TMyObject = class(TInterfacedObject, IMyInterface)
private
function GetSomething: WideString;
procedure SetSomething(const Value: WideString);
public
property Something: WideString read GetSomething write SetSomething
end;
我使用此接口能够跨DLL与此对象进行交互。
现在我想继承这个对象并覆盖其中的一些方法......
TMyOtherObject = class(TMyObject)
private
function GetSomething: WideString; override;
procedure SetSomething(const Value: WideString); override;
除了我想使基本字段虚拟和抽象基本上迫使孩子继承这些......
TMyObject = class(TInterfacedObject, IMyInterface)
private
function GetSomething: WideString; virtual; abstract;
procedure SetSomething(const Value: WideString); virtual; abstract;
我可以这样做并让界面仍然可以使用这些字段吗?我是否需要在界面中以这种方式定义它? (我当然知道界面中的所有字段都已经是抽象的)
答案 0 :(得分:4)
你确实可以做到这一点。可以使用抽象或其他方式的虚方法来满足接口契约。
您无法将接口方法声明为virtual
或abstract
。这无济于事,因为virtual
和abstract
是实现的属性而不是接口。
最后,您不需要在实现对象中再次声明该属性。由于我希望你只是通过界面引用这些对象,所以重复属性声明几乎没有意义。
这是一个简单的程序来证明这一点:
{$APPTYPE CONSOLE}
type
IMyInterface = interface
procedure Foo;
end;
TMyObject = class(TInterfacedObject, IMyInterface)
private
procedure Foo; virtual; abstract;
end;
TMyOtherObject = class(TMyObject)
private
procedure Foo; override;
end;
procedure TMyOtherObject.Foo;
begin
Writeln(ClassName);
end;
var
Intf: IMyInterface;
begin
Intf := TMyOtherObject.Create;
Intf.Foo;
Readln;
end.