是否有可能组成一组相似的类?

时间:2014-06-23 18:44:12

标签: c#

我想知道我是否可以创建一组具有相同功能的类,但每种类中的算法都不同。让我们说我们有。 Multiply.cs,Add.cs和Subtract.cs。每个人都有这种结构:

public Class(int BaseInt)
{
    ...
}

public MakeNumber(int Oint)
{
    ...
}

因此,Multiply.cs MakeNumber()与Add.cs MakeNumber()方法不同,但两者都会返回一个int,因此可以在类似的上下文中使用。有没有办法配对这些课程,让我们说我们称这个班组为运营商。我是否能够在此组下声明变量。

Operators MyOperator = new Operators();

但后来我可以说

MyOperator = Multiply;

2 个答案:

答案 0 :(得分:1)

这种东西是用于接口的常见设计模式。然而,使用你的例子会有点奇怪。

public interface IMakesNumber
{
public int MakeNumber(int number);
}

然后你所有的课程都可以实现它......

public MyMultiplication : IMakesNumber
{
public int MakeNumber(int number)
{
//bla
}
}

然后你可以做这样的事情

IMakesNumber myOperator = //Generally you'd use a Factory Design Pattern

int something = myOperator.MakeNumber(no);

取决于myOperator的实际类型 - 无论您实施的是什么,都会发生。

答案 1 :(得分:1)

我会考虑Interface 1 (注意这是“将数字作为原始数字”,但这可以使用相同的想法完成;这似乎是更符合逻辑的目标)

interface IBinaryOp { int Apply(int a, int b); }

然后可以创建不同的实现

class Add : IBinaryOp {
    public int Apply(int a, int b) { return a + b; }
}

class Multiply : IBinaryOp {
    public int Apply(int a, int b) { return a * b; }
}

然后可以使用生成的实例polymorphically

IBinaryOp op = (new Random().NextDouble() < .5) ? new Add() : new Multiply();
int r = op.Apply(2, 4);
// r is 6 or 8, depending upon which instance was created

1 虽然C#也允许通过derived classes and inheritance包含多态性,但我倾向于避免这种情况并使用接口 - 即使在我使用继承来帮助共享实现的情况下 - 暴露类型。