簡體   English   中英

私人清單 <T> 與公共IEnumerable <T> vs ReadOnlyCollection <T>

[英]Private List<T> with public IEnumerable<T> vs ReadOnlyCollection<T>

考慮以下類:

public abstract class Token
{
    private List<Token> _Tokens { get; set; }

    // ReadOnly public is mandatory. How to give protected add-only, index-based access?
    public ReadOnlyCollection<Token> Tokens { get { return (this._Tokens.AsReadOnly()); } }

    // AddOnly for derived classes.
    protected Token AddToken (Token token) { this._Tokens.Add(token); return (token); }
}

public class ParenthesesToken: Token
{
    // This method is called frequently from public code.
    public void Parse ()
    {
        // Good enough.
        base.AddToken(...);

        // Is a call to List<T>.AsReadOnly() necessary?
        // Add-only, indexed-based access is mandatory here. IEnumerable<T> will not do.
        foreach (var token in this.Tokens) { /* Do something... */ }
    }
}

有沒有關於List和ReadOnlyCollection實現的接口允許單向類型轉換而不是重新創建列表到其他具體實現?

目標是允許公共只讀訪問,但也保護對派生類的僅添加,基於索引的訪問。

public abstract class Token
{
    private List<Token> _tokens { get; set; }

    public IEnumerable<Token> Tokens 
    { 
       get { return _tokens; } 
    }

    protected Token AddToken (Token token) 
    { 
       _tokens.Add(token); 
       return token; 
    }

    protected Token GetTokenAt(int index)
    {
        return _tokens[index];
    }
}

我不喜歡返回只讀集合,因為IEnumerable是一個只讀接口,它隱藏了消費者的實現。 有人可能會爭辯說,消費者可能會將IEnumerable投射到列表並添加新項目,但這意味着兩件事:

  • 消費者違反了您提供的API
  • 你不能阻止消費者使用反射

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM