2

我有一个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包含一个IConditions 列表,它将决定是否SatisfiedBy成功。

我的第一个想法是CombinationCondition实现IList<Something>,但我很快意识到我只是在复制List<Something>. 那么为什么不只是子类呢?

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

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

但是如何访问内部列表?

4

4 回答 4

5

就个人而言,对于您展示的用例,我只会制作这个 implement IEnumerable<Condition>。然后,您可以通过调用 (internal, encrypted)List<Condition>的方法来实现 GetEnumerator。

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

于 2009-12-15T18:30:17.367 回答
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:
您也可以考虑重命名CombinationConditionCompoundCondition...更有意义,至少对我来说:)

于 2009-12-15T18:32:11.047 回答
0

我不确定我 100% 了解您要做什么,但这会解决您的需求吗?

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

这样,您可以为您需要的任何泛型类型实现它

于 2009-12-15T18:31:36.617 回答
0

一种可能性是 IList<ICondition> 类型的属性,可能称为“条件”。

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

但是,更喜欢从 ICollection<T> 进行子类化。

于 2009-12-15T18:32:09.203 回答