1

私は COM インターフェイスに新しい機能を追加してきましたが、それを行う (そして後方互換性を維持する) 唯一の方法は、古いインターフェイスを継承して新しいメソッドを追加する新しいインターフェイスを作成することです。私はこれを試みましたが、私の階層はすでに非常に複雑です。

これが私のインターフェースが現在どのようになっているとしましょう:

IBaseInterface
    | |
IDerivedInterface

ベース インターフェイスにいくつかの機能を追加すると、次のようになります。

IBaseOldInterface
    | |
IBaseInterface
    | |
IDerivedInterface

この新しい機能を追加したので、新しい IDerivedInterface を作成する必要がありますか? 現時点で試してみましたが、すべてのケースで適切に機能するとは限りません。

本当に確認と、可能であれば理由の説明が欲しいだけです

私の理想的な状況とその理由をさらに説明する必要があります。

すべての派生クラスが使用できる IBaseInterface クラスにいくつかのメソッドを追加したいと考えています。私が可能だと思ったのはこれです:

                   IBaseOldInterface
                  / \
IDerivedOldInterface IBaseNewInterface
                   \ /
                  IDerivedNewInterface

Diamond Inheritance は避けるべきだということは理解していますが、それらは単なるインターフェイスなので、問題ないと思います。

ユーザーが INewDerivedInterfaces の 1 つを要求すると、この新しい構造を持つ。クエリ インターフェイスは、それが INewDerivedInterface であるか IOldDerivedInterface であるかにかかわらず、その IID の正しいインターフェイスを返します。

4

4 に答える 4

0

に新しい機能を追加するにIBaseInterfaceは、新しいインターフェイスを作成する必要がありますが、既存の階層をまったく変更しないでください。代わりにできることは、実装するクラス新しいインターフェイスIBaseInterface も実装させることです。たとえば、次のようになります。

type
  IBaseInterface = interface
    ...
  end;

  IBaseInterface2 = interface(IBaseInterface)
    ...
  end;

  IDerivedInterface = interface(IBaseInterface)
    ...
  end;

  TBaseClass = class(TInterfacedObject, IBaseInterface, IBaseInterface2)
    ...
  end;

  TDerivedClass = class(TBaseClass, IDerivedInterface)
    ...
  end;

そうすれば、新しい機能を使用したいコードは、そのインターフェースのIBaseInterface2いずれかを照会でき、成功した場合は新しい機能を使用できます。たとえば、次のようになります。IBaseInterface

var
  Base2: IBaseInterface2;
begin
  if Supports(AnyBaseOrDerivedInterfacePtr, IBaseInterface2, Base2) then
  begin
    // use Base2 as needed...
  end;
end;
于 2013-07-06T03:38:50.987 に答える