在C#项目中,我陷入了编写大量代码以实现非常类似功能的情况。我觉得我应该以某种方式重构这个,但我不知道该怎么做。
简而言之,我有一个从基类继承的类AClass
,BClass
等的列表。每个类都可以接受该类唯一的条件列表。例如,AClass
可以接受ACondition
类型的条件,而BClass
可以接受BCondition
类型的条件。每个条件类都是工厂模型中的抽象类,它可以接受一组公共派生类的嵌套条件," AndCondition"," OrCondition"," NotCondition" ,以便使用类似于下面的例子。
AClass foo = new AClass();
foo.SetConditions(ACondition.And(ACondition.Factory1(),
ACondition.Not(ACondition.Factory2())));
当然,我可以为BClass
写同样的东西,BCondition
有不同的工厂。我的想法是创建一个通用的抽象类并继承它。
public abstract Condition<T>
{
public static Condition<T> And(Condition<T> c1, Condition<T> c2)
{
// Returns an AndCondition derived from Condition<T>.
}
// Other common implementation.
}
public abstract ACondition : Condition<AClass>
{
public static ACondition Factory1()
{
// Returns some class derived from ACondition.
}
// Other factory implementations.
}
这有几个问题。首先,目前,除了区分这个类的不同实例之外,我没有使用T
。这对于防止意外(或有意)使用期望BCondition
的{{1}}是必要的。但是,它并不能阻止某人创建另一个派生自ACondition
的类,并在不期望的地方使用它。换句话说,有人可以做到以下几点:
Condition<AClass>
然后像这样不必要地注入它:
public class MyACondition : Condition<AClass>
{
public MyACondition()
{
// Initialize a new instance of MyACondition.
}
}
我也试过把T作为返回类型;例如将AClass foo = new AClass();
foo.SetConditions(ACondition.Not(new MyACondition()));
更改为Condition<T> And(Condition<T> c1, Condition<T> c2)
,但这迫使我继承T And(T c1, T c2)
,这是不允许的。所以,就目前而言,我必须为每个Condition类编写单独的T
,And
和Or
工厂。似乎应该有一个更好的方法,但我很难过。