立即跳入问题。
场景 - 步骤:
1)我定义了一个接口
IMathBase
{
void Add(int a , int b);
void Sub(int a, int b);
}
2)具体类PlusMinus
实现IMathBase
。
3)具体类PlusMinusDiv
实现IMathBase
。 PlusMinusDiv
添加了另一个函数void Div(int a, int b)
4)IMathBase mathBase = new PlusMinusDiv();
5)mathBase.Div(10,20)
;
我知道第5步无效。处理上述情况的最佳方法是什么[向实现通用接口的具体类添加新方法]?
提前致谢。
此致
乔
答案 0 :(得分:3)
无论
PlusMinusDiv mathBase = new PlusMinusDiv();
mathBase.Div(10,20);
或
IMathBase mathBase = new PlusMinusDiv();
((PlusMinusDiv)mathBase).Div(10,20);
答案 1 :(得分:2)
将新方法添加到接口并在所有具体类中实现它,或者为变量提供一种PlusMinusDiv而不是IMathBase。正确的答案取决于您的应用程序的需求。
答案 2 :(得分:2)
有几种方法可以解决这个问题,你可以:
1.将新方法添加到接口定义中,并更新任何现有的实现。
2.如上所述,但使用可提供默认实现的抽象基类。这样,从抽象基类继承的任何现有实现都不会中断,并且可以选择覆盖基类提供的实现。
3.使用扩展方法,例如:
public static int Div(this IMathBase mathBase, int a, int b) {
return (a / b);
}
int result = mathBase.Div(20, 10);
答案 3 :(得分:1)
C#中的接口支持继承。因此,您可以添加从IMathBase继承的新接口,例如IDivMath,例如在此示例中:
public interface IMathBase
{
void Sub(int x, int y);
void Add(int x, int y);
}
public interface IDivMath : IMathBase
{
void Div(int x, int y);
}
所以,让你的类实现IDivMath接口,其中包含IMathBase中的方法:
public class PlusMinusDiv() : IDivMath
{
public void Div(int x, int y)
{}
public void Add(int x, int y)
{}
public void Sub(int x, int y)
{}
}
您可以使用任一界面引用您的课程,具体取决于您打算如何使用该课程:
IMathBase* mathBase = new PlusMinusDiv();
IDivMath* divMath = new PlusMinusDiv();
答案 4 :(得分:1)
如果您要调用界面中未定义的 Div 方法,则必须了解该方法的存在以及您计划使用该方法的上下文。
我会说你的问题没有具体的答案,因为你没有提供足够的细节。使用定义的 Div 方法实现另一个界面可能会非常适合您。或者上下文非常简单,您可以使用精确类型的指针实例化您的类。
答案 5 :(得分:0)
如果您在.Net 4中运行它,您也可以这样做:
dynamic mathBase = new PlusMinusDiv();
mathBase.Div(10,20);
与
大致相同PlusMinusDiv mathBase = new PlusMinusDiv();
mathBase.Div(10,20);