与抽象类C#的接口关系

时间:2014-10-04 09:31:27

标签: c#

我读到Interface是隐式纯粹的抽象。那么为什么实现接口的类的方法不使用override关键字作为前缀?

interface IA
{
    void Method();
}

class B : IA
{
   public void Method()       // why it is not "public override void Method()"
   {
       Console.Writeline("A derived");
   }
}

修改 对于那些想知道我在哪里读它的人。转到下面的抽象类v / s接口部分: http://www.codeproject.com/Articles/6118/All-about-abstract-classes

2 个答案:

答案 0 :(得分:3)

接口不是纯粹的抽象类,它只是一个接口。

接口声明与公共方法和属性的契约,任何实现它的东西都必须遵守。除签名外,它不提供任何内容。

另一方面,抽象类为其部分或全部功能提供基本实现。它可以提供实际的逻辑。接口不能。

Overriding正在用另一个逻辑替换方法中的逻辑。由于接口从不提供任何逻辑(他们不能),因此使用关键字override毫无意义。

另外两个非常重要的区别:

  • 您只能从一个类派生(抽象或不抽象),但您可以根据需要实现任意数量的接口。
  • 您可以使用实现接口的结构,但是您不能创建抽象结构,因为结构不能相互继承。

答案 1 :(得分:0)

考虑接口的最佳方法是使用 can 关系来考虑它们与您标记它们的类,而不是可以认为是的父类。 关系。

在您的示例中,不需要提及override关键字,因为您没有覆盖任何已实现的行为,您可以简单地说您的类需要履行其合同以提供Method()实现。

尽管接口可以被认为是纯粹的抽象类,但是有一个明显的区别,即类可以被标记为实现多个接口,而它只能从一个父类继承。

class B : IA, IB, IC

因此,您可以将您的类实例作为任何这些接口类型传递,具体取决于您需要向方法公开哪个联系