我想使用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
没有实施GetCurrent
。为什么编译器告诉我GetCurrent
当它显然没有丢失? (为了记录,GetCurrent
已实现,为简洁起见,此处仅省略。)谢谢!
答案 0 :(得分:8)
IEnumerator<T>
继承自IEnumerator
界面。它们都有GetCurrent()
方法,其中一种是常用方法,第二种是泛型T
方法;
因此,在您的课程中,您必须同时实施getCurrent():TObject
(来自IEnumerator
)和getCurrent():T
(来自IEnumerator<T>
);
一个小问题是两个方法都有相同的参数,你不能简单地声明它们。所以你应该使用别名:
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上查看方法解析条款
所以,在你的情况下,代码应该看起来像(我标记所有方法摘要):
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;