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