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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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();
  }
}

我想知道基类是否定义了一些虚方法,那么是否强制在派生类中重写这些方法?同样,如果基类方法是抽象的,我们需要在派生类中实现该方法,但是重写修饰符是必需的吗?如果省略了override修饰符怎么办?


I want to know if the base class has defined some methods virtual,
then is it mandatory to override them in derive class?

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

If the base class method is abstract, we need to implement the method
in derive class, but is override modifier is mandatory?

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

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

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

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


它完全基于问题第一部分中的逻辑,在从形状类派生的方形类中,您声明将隐藏其父虚拟颜色方法的颜色方法,当子类中存在父类时,不需要在子类中复制相同的方法,除非您想隐藏父类的方法。在抽象类中,如果有虚拟方法,则必须在派生类中实现或重写它们,在示例中,这些形状的实例将在形状类中调用虚拟颜色方法。


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

1
2
Shapes
Shapes

这是因为,通过省略override关键字,默认情况下您会隐藏基类方法-这意味着该方法不能再以多态方式使用-尽管s2Square的实例,因为用于调用该方法的对象引用是Shapes,所以使用Shapes方法。

另一方面,如果该方法标记为override,则即使在Shape类型的对象引用上也会调用它,因为该实例使用了继承树中最派生的Color()方法。


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

该页中的副本:

To make a method virtual, the virtual modifier has to be used in the
method declaration of the base class. The derived class can then
override the base virtual method by using the override keyword or hide
the virtual method in the base class by using the new keyword. If
neither the override keyword nor the new keyword is specified, the
compiler will issue a warning and the method in the derived class will
hide the method in the base class