Как правильно сделать так, чтобы интерфейс поддерживал итерацию?

Как я могу открыть этот 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 в пакете.

5
задан Warren P 18 June 2011 в 13:41
поделиться