簡體   English   中英

C#:子類列表 <Something> ?

[英]C#: Subclass List<Something>?

我有一個類EqualCondition它實現我自己的接口ICondition ,它只有一個方法: SatisfiedBy(Something)

public class EqualCondition : ICondition {
    private Something m_Something;

    public HelloCondition(Something something) {
        m_Something = something;
    }

    // Magic!!!
    public bool SatisfiedBy(Something something) {
        return something == m_Something;
    }
}

因此, ICondition實現非常簡單。 現在,我正在嘗試創建一個同時實現它的CombinationCondition 這個想法是CombinationCondition將包含ICondition的列表,該列表將確定SatisfiedBy是否成功。

我的第一個想法是使CombinationCondition實現IList<Something>但是我很快意識到我只是在復制List<Something> 那么,為什么不只是繼承它呢?

這個想法聽起來不錯,直到我再次考慮如果我只是將List<Something>子類化了,如何實現SatisfiedBy 我需要去做:

return innerList.All(x => x.SatisfiedBy(something))

但是,如何訪問內部列表?

就您所顯示的用例而言,我個人將使此實現為IEnumerable<Condition> 然后,您可以通過調用(內部封裝的) List<Condition>的方法來實現GetEnumerator。

ICollection<Condition>可能更有意義(因此您可以在運行時添加條件),但是僅在需要此功能時。 對於這種情況,在這種情況下,實現IList<T>似乎有點過頭了。

從您發布的內容來看,我只會讓CombinationCondition包含(封裝)一個List<Something> 除非絕對必要,否則外界無需知道這是一個清單。

編輯1:

public class CombinationCondition : ICondition {
private List<ICondition> list;

public CombinationCondition(List<ICondition> list) {
    this.list = list;
}

// if you need it
public void AddCondition( ICondition condition ){
    list.Add( condition );
}

// Still Magic!!!
public bool SatisfiedBy(Something something) {
    return list.Any( x => x.SatisfiedBy( something ) );
}

}

編輯2:
您可能還考慮將CombinationCondition重命名為CompoundCondition ...更有意義,至少對我而言:)

我不確定我100%理解您要做什么,但是這可以解決您的需求嗎?

public interface ICondition<T>
{
   bool SatisfiedBy(T something);
}

這樣,您可以將其實現為所需的任何通用類型

一種可能是類型為IList <ICondition>的屬性,可能稱為“ Conditions”。

您不需要訪問內部列表-您可以訪問“自身”類。

但是,更喜歡從ICollection <T>進行子分類。

暫無
暫無

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

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