繁体   English   中英

在 C# 中,对于基础 class 的虚拟/抽象方法,在派生 class 中,覆盖修饰符是强制性的

[英]In C# override modifier is mandatory in derive class for virtual/abstract methods of base class

public class Shapes
{
  public virtual void Color()
  {
    Console.WriteLine("Shapes");
  }
}

public class Square : Shapes
{
  public void Color()
  {
    Console.WriteLine("Square");
  }
}

public class Test
{ 
  public static void main()
  {
    Shapes s1 = new Shapes();
    s1.Color();
    Shapes s2 = new Square();
    s2.Color();
  }
}

我想知道基础 class 是否定义了一些虚拟方法,那么在派生 class 中是否必须覆盖它们? 同样,如果基础 class 方法是抽象的,我们需要在派生 class 中实现该方法,但是覆盖修饰符是强制性的吗? 如果忽略了 override 修饰符会怎样。

我想知道基础 class 是否定义了一些虚拟方法,那么在派生 class 中是否必须覆盖它们?

当然不。 由派生的 class 决定是否覆盖虚拟方法。 请注意,某些类会建议派生类在某些情况下覆盖特定的虚拟方法,但编译器不会强制执行。

如果基础 class 方法是抽象的,我们需要在派生 class 中实现该方法,但是覆盖修饰符是强制性的吗?

是的,需要使用override关键字,否则方法会被派生的class中的定义隐藏。

如果您实际运行您的代码,您将看到“形状”打印了两次。 这是因为Squares class 中的Color()方法没有使用override关键字声明。 因此,它隐藏了基本 class 方法。 这意味着它只能通过Squares类型的变量访问:

Sqares s3 = new Squares();
s3.Color();

这将打印“Square”,因为您在正确类型的变量上调用该方法。

看看这个链接,它可能有用。

该页面中的副本:

要使方法虚拟化,必须在基础 class 的方法声明中使用virtual修饰符。 派生的 class 然后可以使用override关键字覆盖基本虚拟方法,或使用 new 关键字隐藏基本 class 中的虚拟方法。 如果未指定override关键字和new关键字,编译器将发出警告,派生 class 中的方法将隐藏基 class 中的方法

从您发布的示例代码中可以看出,output 将是

Shapes
Shapes

这是因为通过省略override关键字,您默认隐藏基本 class 方法 - 这意味着该方法不能再以多态方式使用 - 即使s2Square的一个实例,因为用于调用该方法的 object 引用是Shapes , 使用Shapes方法。

另一方面,如果该方法被标记为override ,它甚至会在类型为Shape的 object 引用上调用,因为使用了给定实例的 inheritance 树中最派生的Color()方法。

它完全基于您在问题的第一部分中的逻辑,In Square class 派生自 Shapes class 您声明将隐藏其父虚拟 Color 方法的 Color 方法,您不需要在子 ZA2F2ED4F8EBC2CBB4C21A29DC4 中复制相同的方法存在于它的父类中,除非你想隐藏父类的方法。 在抽象 class 中,如果您有一个虚拟方法,则必须在派生类中实现或覆盖它们,在您采样这些 Shapes 的实例时,将调用 Shapes class 中的虚拟 Color 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM