7

作成中のリストIEnumerator<T>の代わりに使用したいと思います。IEnumerator私は次のことを試しました

IMyList = interface(IEnumerator<TElement>)
  procedure Add(Element: TElement);
end;

TMyList = class(TInterfacedObject, IMyList )
private
  function GetCurrent: TElement;
  function MoveNext: Boolean;
  procedure Reset;
public
  property Current: TElement read GetCurrent;
  procedure Add(Element: TElement);
end;

しかし、驚いたことに、それTMyListは実装されていないと言われていますGetCurrentGetCurrent明らかにそうではないのに、なぜコンパイラはそれが欠落していると私に言っているのですか? (記録のために、GetCurrent実装されていますが、簡潔にするためにここでは省略されています。) ありがとう!

4

1 に答える 1

9

IEnumerator<T>インターフェイスから継承しIEnumeratorます。どちらにもGetCurrent()メソッドがあり、そのうちの 1 つは通常のメソッドで、2 つ目はジェネリックTメソッドです。

getCurrent():TObjectしたがって、クラスでは(from IEnumerator) とgetCurrent():T(from )の両方を実装する必要がありますIEnumerator<T>

1 つの小さな問題は、両方のメソッドが同じパラメーターを持ち、単純に両方を宣言できないことです。したがって、エイリアスを使用する必要があります。

  function getCurrentItem() : TElement; //actual method for IEnumerator<T>
  function GetCurrent():TObject;  //method for IEnumerator
  function IMyList.GetCurrent = getCurrentItem; //alias

docwiki http://docwiki.embarcadero.com/RADStudio/en/Implementing_InterfacesのMethod Resolution Clauseを参照してください。

したがって、あなたの場合、コードは次のようになります (私はすべてのメソッドを Abstract とマークしました):

TElement = class(TObject)
end;

IMyList = interface(IEnumerator<TElement>)
  procedure Add(Element: TElement);
end;

TMyList = class(TInterfacedObject, IMyList )
private
  function getCurrentItem() : TElement; virtual; abstract;

  function IMyList.GetCurrent = getCurrentItem;
  function GetCurrent():TObject;  virtual; abstract;

  function MoveNext(): Boolean;   virtual; abstract;
  procedure Reset(); virtual; abstract;
public
  property Current: TElement read GetCurrentItem;
  procedure Add(Element: TElement); virtual; abstract;
end;
于 2012-08-16T10:07:06.883 に答える