关于在C#中使用接口的问题

时间:2011-05-23 18:44:58

标签: c# oop interface

立即跳入问题。

场景 - 步骤:

1)我定义了一个接口

IMathBase 
{
   void Add(int a , int b);
   void Sub(int a, int b);
}

2)具体类PlusMinus实现IMathBase

3)具体类PlusMinusDiv实现IMathBasePlusMinusDiv添加了另一个函数void Div(int a, int b)

4)IMathBase mathBase = new PlusMinusDiv();

5)mathBase.Div(10,20);

我知道第5步无效。处理上述情况的最佳方法是什么[向实现通用接口的具体类添加新方法]?

提前致谢。

此致

6 个答案:

答案 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);