将具有相同行为的静态类分组

时间:2016-06-29 04:49:09

标签: c#

我有一组由静态类组成的逻辑,例如:

static class A {
    static int mutate(int i) { /**implementation*/ };
    static double prop(double a, double b) { /**implementation*/ }; 
}

static class B {
    static int mutate(int i) { /**implementation*/ };
    static double prop(double a, double b) { /**implementation*/ }; 
}

在这种情况下,A和B是通过一组函数(例如mutate)实现相同行为的静态类。我想使用类似于这种模式的接口,但由于静态类无法实现接口,我不知道该怎么做。干净地实施这种行为的最佳方法是什么?

编辑:

这是我目前正在做的一个例子。这些类没有状态,所以通常我会让它们静止。

Interface IMutator {
    int mutate(int i);
}

class A : IMutator {
    int mutate(int i) { /**implementation*/ };
}

class B : IMutator {
    int mutate(int i) { /**implementation*/ };
}

class C {
    public List<IMutator> Mutators;
    public C(List<IMutator> mutators) { 
        Mutators = mutators;
    }
}

//Somewhere else...
//The new keyword for A and B is what really bothers me in this case.
var Cinstance = new C(new List<IMutator>() {new A(), new B() /**...*/});

2 个答案:

答案 0 :(得分:5)

无状态类不必是静态的。 此外,当您想要编写单元测试时,或者当您想要提取一些公共接口时(如您的情况),静态依赖项不是一个好的选择。

拥有非静态类是可以的,只包含逻辑。例如,人们使用无状态控制器构建ASP .NET应用程序。

所以,只需扔掉static并提取界面。

答案 1 :(得分:2)

除了@Dennis的答案(我已经+ 1',它确实是要走的路),其他可行的方法是拥有一组函数({{1} })和/或操作(Func<>)并使用反射解决它们。代码不是特别优雅也不具有高效性,但它有效。

我做了一个简单的例子on dotnetfiddle