Как я могу открыть этот TList из интерфейса как IEnumerator
или IEnumerator
? Я использую 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] FungibleTrollUnit.pas (26): E2252 Метод «GetEnumerator» с идентичными параметрами уже существует
-или-
[Ошибка DCC] FungibleTrollUnit.pas (19): E2291 Отсутствует реализация метода интерфейса IEnumerable.GetEnumerator
-или-
[Ошибка DCC] FungibleTrollUnit.pas (19): E2291 Отсутствует реализация метода интерфейса IEnumerable.GetEnumerator
Кажется, я должен объявить две формы GetEnumerator, если я объявлю TFungibleTrolls для реализации IEnumerable, но я не могу показаться чтобы выяснить, как это сделать, либо с перегрузками, либо без перегрузок, либо с помощью «предложения разрешения метода», например:
function IEnumerable.GetEnumerator = GetPlainEnumerator; // method resolution clause needed?
function GetEnumerator:IEnumerator<IFungibleTroll>;
function GetPlainEnumerator:IEnumerator;
Это, вероятно, кажется довольно простым использованием IEnumerable и создания итерации поддержки интерфейса, и но я застрял.
Обновление: кажется, когда я пытаюсь сделать это без предварительного объявления List
, я попадаю в трещину, вызванную тем, что IEnumerable
наследуется от IEnumerable
, и тем не менее, вместо одного метода перечислителя get мой класс должен предоставлять несколько, а поскольку мой класс не является универсальным, он не может "отображать себя "к требованиям IEnumerable напрямую, если я не использую общее объявление List
. Образец Марьяна работает при компиляции в проект (.dproj + .dpr), но не когда он встроен в пакет (.dproj + .dpk) и скомпилирован в среде IDE. Он отлично работает из командной строки в пакете, но не в среде IDE в пакете.