【发布时间】:2011-09-17 09:02:09
【问题描述】:
如何从接口公开此 TList,如 IEnumerator 或 IEnumerator<IFungibleTroll>?我正在使用 Delphi XE。
这是我走了多远:
unit FungibleTrollUnit;
interface
uses
Windows, Messages, SysUtils,
Variants, Classes, Graphics,
Controls, Forms,
Generics.Collections;
type
IFungibleTroll = interface
['{03536137-E3F7-4F9B-B1F5-2C8010A4D019}']
function GetTrollName:String;
function GetTrollRetailPrice:Double;
end;
TFungibleTrolls = class (TInterfacedObject,IEnumerable<IFungibleTroll>)
protected
FTrolls:TList<IFungibleTroll>;
public
// IEnumerable
function GetEnumerator:IEnumerator<IFungibleTroll>;//
// function GetEnumerator:IEnumerator; overload;
// find/search app feature requires searching.
// this
function FindSingleItemByName(aName:String;patternMatch:Boolean):IFungibleTroll;
function FindMultipleItemsByName(aName:String;patternMatch:Boolean):IEnumerable<IFungibleTroll>;
function FindSingleItemByIdentifier(anIdentifer:String):IFungibleTroll;// use internal non-visible identifier to find an app.
constructor Create;
property Trolls:TList<IFungibleTroll> read FTrolls; // implements IEnumerable<IFungibleTroll>;??
private
end;
implementation
{ TFungibleTrolls }
constructor TFungibleTrolls.Create;
begin
FTrolls := TList<IFungibleTroll>.Create;
end;
function TFungibleTrolls.FindMultipleItemsByName(aName: String;
patternMatch: Boolean): IEnumerable<IFungibleTroll>;
begin
end;
function TFungibleTrolls.FindSingleItemByIdentifier(
anIdentifer: String): IFungibleTroll;
begin
end;
function TFungibleTrolls.FindSingleItemByName(aName: String;
patternMatch: Boolean): IFungibleTroll;
begin
end;
function TFungibleTrolls.GetEnumerator: IEnumerator<IFungibleTroll>;
begin
result := FTrolls.GetEnumerator;
end;
//function TFungibleTrolls.GetEnumerator: IEnumerator;
//begin
// result := FTrolls.GetEnumerator; // type IEnumerator<IFungibleTroll> or IEnumerator?
//end;
end.
我陷入了三个我不知道如何解决的错误之一:
[DCC Error] FungibleTrollUnit.pas(26): E2252 Method 'GetEnumerator' with identical parameters already exists
-或者-
[DCC Error] FungibleTrollUnit.pas(19): E2291 Missing implementation of interface method IEnumerable.GetEnumerator
-要么-
[DCC Error] FungibleTrollUnit.pas(19): E2291 Missing implementation of interface method IEnumerable.GetEnumerator
如果我声明 TFungibleTrolls 来实现 IEnumerable,我似乎必须声明两种形式的 GetEnumerator,但我似乎无法弄清楚如何做到这一点,或者使用重载,或者没有重载,或者使用“方法解析子句” ",像这样:
function IEnumerable.GetEnumerator = GetPlainEnumerator; // method resolution clause needed?
function GetEnumerator:IEnumerator<IFungibleTroll>;
function GetPlainEnumerator:IEnumerator;
这似乎是 IEnumerable 的一个非常基本的用法,并进行了接口支持迭代,但是,我被卡住了。
更新:似乎当我尝试在没有首先声明 List<T> 的情况下执行此操作时,我陷入了由于 IEnumerable<T> 继承自 IEnumerable 的事实而导致的裂缝,然而,而不是单个 get 枚举器方法,我的类必须提供多个,因为我的类不是泛型的,所以它不能直接“映射”到 IEnumerable 的要求,除非我使用泛型 List<T> 声明。 Marjan 的示例在编译到项目 (.dproj+.dpr) 时有效,但在构建到包 (.dproj+.dpk) 并在 IDE 中编译时无效。它在命令行中,在一个包中工作正常,但在 IDE 中,在一个包中。
【问题讨论】:
标签: delphi list generics interface