我有一组由静态类组成的逻辑,例如:
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() /**...*/});
答案 0 :(得分:5)
无状态类不必是静态的。 此外,当您想要编写单元测试时,或者当您想要提取一些公共接口时(如您的情况),静态依赖项不是一个好的选择。
拥有非静态类是可以的,只包含逻辑。例如,人们使用无状态控制器构建ASP .NET应用程序。
所以,只需扔掉static
并提取界面。
答案 1 :(得分:2)
除了@Dennis的答案(我已经+ 1',它确实是要走的路),其他可行的方法是拥有一组函数({{1} })和/或操作(Func<>
)并使用反射解决它们。代码不是特别优雅也不具有高效性,但它有效。
我做了一个简单的例子on dotnetfiddle