具有类似实现的多个类,与不同的相应类一起使用?

时间:2017-10-14 17:00:14

标签: c# generics inheritance code-duplication factory-method

在C#项目中,我陷入了编写大量代码以实现非常类似功能的情况。我觉得我应该以某种方式重构这个,但我不知道该怎么做。

简而言之,我有一个从基类继承的类AClassBClass等的列表。每个类都可以接受该类唯一的条件列表。例如,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类编写单独的TAndOr工厂。似乎应该有一个更好的方法,但我很难过。

0 个答案:

没有答案