【问题标题】:question regarding the use of interfaces in C#关于在 C# 中使用接口的问题
【发布时间】:2011-05-23 18:44:57
【问题描述】:

直接进入问题。

场景步骤:

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 步无效。处理上述情况的最佳方法是什么[向实现公共接口的具体类添加新方法]?

提前致谢。

问候,

【问题讨论】:

  • 您使用指针是否有原因,您的意思是这种情况发生在不安全的代码块中吗?您是否有理由不能只使用普通的 c# 引用。
  • @rerun。感谢您指出了这一点。删除了 *. :)

标签: c# oop interface


【解决方案1】:

要么

PlusMinusDiv mathBase = new PlusMinusDiv();
mathBase.Div(10,20);

IMathBase mathBase = new PlusMinusDiv();
((PlusMinusDiv)mathBase).Div(10,20);

【讨论】:

    【解决方案2】:

    要么将新方法添加到接口并在所有具体类中实现它,要么将变量类型设为 PlusMinusDiv 而不是 IMathBase。正确答案取决于您的应用程序的需求。

    【讨论】:

      【解决方案3】:

      有几种方法可以解决这个问题,你可以:

      1.只需将新方法添加到接口定义中,并更新任何现有实现。

      2. 同上,但使用可以提供默认实现的抽象基类。这样,任何从抽象基类继承的现有实现都不会中断,并且可以选择覆盖基类提供的实现。

      3.使用扩展方法,例如:

      public static int Div(this IMathBase mathBase, int a, int b) {
          return (a / b);
      }
      
      int result = mathBase.Div(20, 10);
      

      【讨论】:

        【解决方案4】:

        如果您正在调用未在接口中定义的 Div 方法,那么您必须知道该方法的存在以及您打算使用它的上下文。

        我会说你的问题没有具体的答案,因为你没有提供足够的细节。使用定义的 Div 方法实现另一个接口可能会非常适合您。或者上下文非常简单,您可以使用确切类型的指针来实例化您的类。

        【讨论】:

          【解决方案5】:

          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();
          

          【讨论】:

            【解决方案6】:

            如果您在 .Net 4 中运行它,您也可以这样做:

            dynamic mathBase = new PlusMinusDiv();
            mathBase.Div(10,20);
            

            和这个差不多

            PlusMinusDiv mathBase = new PlusMinusDiv();
            mathBase.Div(10,20);
            

            【讨论】:

              猜你喜欢
              • 2011-04-28
              • 2023-03-13
              • 2010-09-19
              • 1970-01-01
              • 2011-03-06
              • 1970-01-01
              • 1970-01-01
              • 2011-06-12
              • 2019-06-08
              相关资源
              最近更新 更多