在C#override中,修饰符在基类的虚拟/抽象方法的派生类中是必需的

时间:2011-08-16 04:05:54

标签: c# oop inheritance override

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

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

4 个答案:

答案 0 :(得分:7)

  

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

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

  

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

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

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

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

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

答案 1 :(得分:3)

看看this link,它可能会有用。

该页面中的副本:

  

要使方法成为虚拟,必须在中使用虚拟修饰符   基类的方法声明。然后派生类可以   使用覆盖关键字覆盖基本虚拟方法或隐藏   使用new关键字在基类中的虚方法。如果   既未指定覆盖关键字,也未指定关键字   编译器会发出警告,派生类中的方法会   隐藏基类中的方法

答案 2 :(得分:3)

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

Shapes
Shapes

这是因为省略了override关键字,默认情况下隐藏基类方法 - 这意味着该方法不能再以多态方式使用 - 即使{{1是s2的实例,因为用于调用方法的对象引用是Square,使用Shapes方法。

如果方法用Shapes标记,那么即使在类型override的对象引用上也会调用它,因为给定的继承树中派生的Shape方法最多使用了实例。

答案 3 :(得分:3)

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