我想知道我是否可以创建一组具有相同功能的类,但每种类中的算法都不同。让我们说我们有。 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;
答案 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包含多态性,但我倾向于避免这种情况并使用接口 - 即使在我使用继承来帮助共享实现的情况下 - 暴露类型。