在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();
}
}
我想知道基类是否定义了一些虚拟方法,那么是否必须在派生类中重写它们?类似地,如果基类方法是抽象的,我们需要在派生类中实现该方法,但是重写修饰符是强制性的吗?
我想知道基类是否定义了一些virtual方法,那么必须在派生类中重写它们吗?
绝对不会。是否重写虚方法由派生类决定。请注意,有些类会建议派生类在某些情况下重写特定的虚方法,但编译器不会强制这样做。
如果基类方法是抽象的,我们需要实现该方法在派生类中,但是重写修饰符是强制性的吗?
是的,您需要使用override
关键字,否则该方法将被派生类中的定义隐藏。
如果你实际运行你的代码,你会看到"Shapes"被打印了两次。这是因为Squares
类中的Color()
方法没有使用override
关键字声明。因此,它隐藏了基类方法。这意味着它只能通过类型为Squares
的变量访问:
Squares s3 = new Squares();
s3.Color();
这将打印"Square",因为你在正确类型的变量上调用该方法
看看这个链接,可能会有用。
该页的副本:
要使方法成为虚方法,必须在基类的方法声明。然后派生类可以通过使用override关键字或hide重写基虚方法通过使用new关键字在基类中创建虚拟方法。如果既没有指定override关键字,也没有指定new关键字编译器将发出警告,派生类中的方法将发出警告将方法隐藏在基类
中
从您发布的示例代码中可以看到,输出将是
Shapes
Shapes
这是因为通过省略override
关键字,您默认情况下隐藏了基类方法-这意味着该方法不能再以多态方式使用-即使s2
是Square
的实例,因为用于调用该方法的对象引用是Shapes
,因此使用Shapes
方法。
如果方法被标记为override
,另一方面,它甚至会在Shape
类型的对象引用上被调用,因为在给定实例的继承树中使用了最派生的Color()
方法。
这完全是基于你的逻辑在你的问题的第一部分,在Square类这是从形状类派生的你声明颜色方法,这将隐藏其父虚拟颜色方法,你不需要在子类复制相同的方法,当它存在于它的父,除非当你想隐藏父类的方法。在抽象类中,如果你有一个虚拟方法,你必须在派生类中实现或重写它们,在你的示例中,这些形状的实例将调用形状类中的虚拟颜色方法。