我可以使用虚拟抽象方法继承接口对象吗?

时间:2013-09-03 11:12:05

标签: delphi inheritance interface

我有一个界面和相应的对象。例如......

  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;

我可以这样做并让界面仍然可以使用这些字段吗?我是否需要在界面中以这种方式定义它? (我当然知道界面中的所有字段都已经是抽象的)

1 个答案:

答案 0 :(得分:4)

你确实可以做到这一点。可以使用抽象或其他方式的虚方法来满足接口契约。

您无法将接口方法声明为virtualabstract。这无济于事,因为virtualabstract是实现的属性而不是接口。

最后,您不需要在实现对象中再次声明该属性。由于我希望你只是通过界面引用这些对象,所以重复属性声明几乎没有意义。

这是一个简单的程序来证明这一点:

{$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.