【问题标题】:Why override keyword is used to implement abstract method of an abstract class but not to implement interface members?为什么override关键字用于实现抽象类的抽象方法而不是实现接口成员?
【发布时间】:2018-07-11 21:50:01
【问题描述】:

看看这段代码。

 public abstract class Customer
 {
    public abstract void Print();
 }

class Program : Customer
{
    public override void Print()
    {
        Console.WriteLine("Print Method");
    }
}

当我们实现抽象类的抽象方法时,我们使用override关键字,如上所示。

现在看看这段代码。

 public interface ICustomer
 {
    void Print();
 }

class Program : ICustomer
{
    public void Print()
    {
        Console.WriteLine("Print Method");
    }
}

当我们实现一个接口的方法时,我们不使用 override 关键字。为什么?

【问题讨论】:

  • 因为这就是该语言功能的设计方式。
  • here
  • 为什么我们使用=来赋值?为什么我们使用& 来执行二进制与?为什么我们使用|| 来执行布尔OR?
  • 我问这个问题是因为接口成员默认是抽象的。所以为了实现它们,我们不应该像抽象类那样使用覆盖。

标签: c# .net


【解决方案1】:

对于一个接口,没有什么可以覆盖的。目前还没有实施。 CLR 不必遍历类层次结构来找到具有适当实现的类,只有一个。

对于抽象方法,已经有一个实现(或类中的定义),并且该实现必须被覆盖。这就是语言的定义方式。

【讨论】:

  • 接口可能“很快”会得到默认实现。 github.com/dotnet/csharplang/blob/master/proposals/…
  • 但是我没有提供类中抽象方法的实现。该方法是抽象的,所以有什么可以覆盖。
  • 方法是抽象的。我想从编译器实现的角度来看,当前的规则更容易。
  • 接口成员默认也是抽象的。所以我们不应该写重写来实现它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2020-04-13
  • 2020-02-04
  • 2017-03-14
  • 2012-07-17
相关资源
最近更新 更多