C#:Subclass List <something>?</something>

时间:2009-12-15 18:28:00

标签: c# interface subclass

我有一个类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>。那么为什么不把它分类呢?

这个想法听起来不错,直到我再次开始考虑如果我只是继承SatisfiedBy如何实现List<Something>。我需要这样做:

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

但是如何访问内部列表?

4 个答案:

答案 0 :(得分:5)

就个人而言,对于您正在展示的用例,我只想制作此工具IEnumerable<Condition>。然后,您可以通过调用(内部的,封装的)List<Condition>方法来实现GetEnumerator。

潜在地,ICollection<Condition>可能更有意义(因此您可以在运行时添加条件),但前提是您需要该功能。在这种情况下,实现IList<T>似乎有点矫枉过正,对于我将看到的用例。

答案 1 :(得分:1)

根据您发布的内容,我只需要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 ...更有意义,至少对我而言:)

答案 2 :(得分:0)

我不确定我是否100%了解您的目标,但这会解决您的需求吗?

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

这样,你可以为你需要的任何通用类型实现它

答案 3 :(得分:0)

一种可能性是IList&lt; ICondition&gt;类型的属性。叫做“条件”。

您无需访问内部列表 - 您可以访问您的班级“本身”。

但是,更喜欢从ICollection&lt; T&gt;。

进行子类化