【问题标题】:Is there a better way to delegate enumeration?有没有更好的方法来委托枚举?
【发布时间】:2013-01-17 17:16:19
【问题描述】:

我有以下代码将枚举交给私有字段:

interface

type    

TMyClassEnumerator = class(TEnumerator<TMyClass>)
end;

TMyContainerClass = class(TObject)
private
  FItems: TObjectDictionary<string, TMyClass>;
public
  function GetEnumerator: TMyClassEnumerator;
end;

implementation

function TMyContainerClass.GetEnumerator: TMyClassEnumerator;
begin
  Result := TMyClassEnumerator(FItems.Values.GetEnumerator);
end;

我这样做对吗?我努力实现IENumerable&lt;TMyClass&gt; 或创建我自己的接口,但是,我没有编译它......上面的代码确实适用于for..in,但我觉得我应该通过实现这样的界面。

【问题讨论】:

    标签: delphi delphi-2010 enumeration


    【解决方案1】:

    您的方法是合理的,但我认为您不需要强制转换或确实声明枚举器类。我会这样做:

    TMyContainerClass = class
    private
      FItems: TObjectDictionary<string, TMyClass>;
    public
      function GetEnumerator: TEnumerator<TMyClass>;
    end;
    
    function TMyContainerClass.GetEnumerator: TEnumerator<TMyClass>;
    begin
      Result := FItems.Values.GetEnumerator;
    end;
    

    【讨论】:

    • 实际上我曾经有过这样的经历,并且不确定“类型化”它是否有任何真正的优势,这似乎经常发生。当我这样做时,演员阵容是必要的。无论如何,我可以忘记实现IENumerable&lt;TMyClass&gt;? Embarcadero 建议这样做,而不仅仅是提供GetEnumerator
    • 如果需要,请实施 IEnumerable&lt;&gt;。如果您想支持 for/in 迭代,那么以上就是您所需要的。我绝对不会声明一个枚举器类。只需使用TEnumerator&lt;TMyClass&gt;
    • 你能告诉我怎么做吗?我的编译器给出了非常模棱两可的错误,我发现的每个来源都使用了一组不同的技巧。
    • 实现IENumerable&lt;TMyClass&gt;
    • 这是一个已经被问到的不同问题。看这里:stackoverflow.com/questions/10657475/… 总而言之,就是头疼!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多