在c#中,基类的虚/抽象方法在派生类中重载修饰符是强制性的

本文关键字:重载 强制性 抽象方法 基类 派生 | 更新日期: 2023-09-27 18:05:46

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

我想知道基类是否定义了一些虚拟方法,那么是否必须在派生类中重写它们?类似地,如果基类方法是抽象的,我们需要在派生类中实现该方法,但是重写修饰符是强制性的吗?

在c#中,基类的虚/抽象方法在派生类中重载修饰符是强制性的

我想知道基类是否定义了一些virtual方法,那么必须在派生类中重写它们吗?

绝对不会。是否重写虚方法由派生类决定。请注意,有些类会建议派生类在某些情况下重写特定的虚方法,但编译器不会强制这样做。

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

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

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

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

这将打印"Square",因为你在正确类型的变量上调用该方法

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

该页的副本:

要使方法成为虚方法,必须在基类的方法声明。然后派生类可以通过使用override关键字或hide重写基虚方法通过使用new关键字在基类中创建虚拟方法。如果既没有指定override关键字,也没有指定new关键字编译器将发出警告,派生类中的方法将发出警告将方法隐藏在基类

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

Shapes
Shapes

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

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

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