1

インターフェイスと、その背後にある対応するオブジェクトがあります。例えば...

  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;

これを行っても、これらのフィールドでインターフェイスを引き続き使用できますか? また、インターフェイス内でもこのように定義する必要がありますか? (もちろん、インターフェースのすべてのフィールドはすでに抽象的であることは知っています)

4

1 に答える 1

4

あなたは確かにこれを行うことができます。仮想メソッド (abstract またはそれ以外) を使用して、インターフェイス コントラクトを満たすことができます。

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.
于 2013-09-03T11:16:08.960 に答える