【问题标题】:Is it possible to use in derived class of interface just some methods this interface in C#?是否可以在接口的派生类中使用 C# 中该接口的一些方法?
【发布时间】:2014-05-22 11:29:41
【问题描述】:

我们有一个初始化了四个方法的接口。

interface A
{
    double S(double R);
    double L(double R); 
    double V(double R,double h);
    double W(double R,double h);   
}

是否可以在其派生类中只实现一些方法?

class Ball:A
{
  public double S(double R)
    {
        return Math.PI * R * R * R;
    }
    public double L(double R)
    {
         return 2*Math.PI * R ;
    }

}

【问题讨论】:

  • 没有。您应该将其拆分为两个或多个接口,或者使用抽象类。
  • 除非你把 Ball 抽象化,否则这是不可能的
  • 即使使用抽象类,您也必须声明所有方法,虽然其中一些可以是抽象的,但您仍然需要让它们存在。
  • @LasseV.Karlsen 完全正确。

标签: c# class methods interface


【解决方案1】:

当您必须在对象(类)上强制执行某些属性时,使用接口。

例如:我们有汽车类、摩托车类和卡车类。这三个类中的每一个都应该有一个 StartEngine() 动作。每个车辆的“引擎如何启动”留给每个特定的类,但它们必须有一个 StartEngine 动作这一事实是接口的领域。所以,它使得接口的每个方法的实现都是强制性的。

因此,我们可以将一些功能列表分组到一个接口中,并且每当一个类实现它需要履行合同的接口时。 因此,我们不能只实现接口的某些功能。实际上,它们只是为了确保函数(在接口中)在继承类中实现。

我们可以像下面这样拆分功能:

 interface B
    {
        double S(double R);
        double L(double R); 
    }

 interface A: B
    {
       double V(double R,double h);
       double W(double R,double h);   
    }

【讨论】:

    【解决方案2】:

    有没有可能,在他的派生类中只使用一些方法?

    不,不可能。

    尝试使用任何选项,而不是 interface

    1. Abstract class
    2. NotImplementedException 派生类上未使用的方法

    【讨论】:

      【解决方案3】:

      不,尽管您可以声明实现这些方法的虚拟版本的基类。

      但是,这似乎是糟糕的设计。

      如果一个球没有 V 或 W 操作,那么也许您不应该将所有这些方法集中到同一个接口中。

      【讨论】:

      • 如果我需要创建一个接口来计算某些对象的面积怎么办。就像方法重载一样,当我们在一个类中只使用一个版本的方法时?作为一个设计点,怎么做?
      【解决方案4】:

      不,这是不可能的。您必须至少将它们实现为什么都不做的空方法或引发异常的方法。

      虽然这可能不是为这种功能使用接口的好地方,因为接口是确保实现它的类至少具有接口中定义的完整方法集的功能。

      【讨论】:

      • 第二位似乎是一个相当糟糕的反模式。
      • 我同意,编译该代码的方法非常糟糕。
      【解决方案5】:

      不,这是不可能的

      如官网所述http://msdn.microsoft.com/en-in/library/orm-9780596521066-01-13.aspx

      接口是一种契约。当你设计一个界面时,你是 说,“如果你想提供这种能力,你必须实现 这些方法,提供这些属性和索引器,并支持 这些事件。”接口的实现者同意合同 并实现所需的元素。

      当你定义一个实现接口的类时,你必须 实现该接口的所有必需成员。

      简而言之,如果您只想采用您提到的两种方法,我建议您再采用一个接口,因为无论您想什么都是不可能的。

      【讨论】:

        【解决方案6】:

        遵循 SOLID 设计原则,尤其是接口隔离,结果是您的接口应该被拆分为多个接口。正如已经回答的那样,您所问的问题在 .NET 中是不可能的。更多关于实体here

        另一种选择是让接口 A 只包含所需的方法,然后接口 B 从 A 派生。然后 Ball 类将实现接口 A。

        【讨论】:

          【解决方案7】:

          您可以使用显式实现:

          class Ball : A
          {
              public double S(double R)
              {
                  return Math.PI * R * R * R;
              }
              public double L(double R)
              {
                  return 2 * Math.PI * R;
              }
          
              double A.V(double R, double h)
              {
                  throw new NotImplementedException();
              }
          
              double A.W(double R, double h)
              {
                  throw new NotImplementedException();
              }
          }
          

          MSDN Link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-05-12
            • 1970-01-01
            • 2020-10-31
            • 1970-01-01
            • 2014-03-01
            • 2015-05-22
            • 1970-01-01
            • 2021-10-31
            相关资源
            最近更新 更多