Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,对于基类的虚拟/抽象方法,派生类中必须使用override修饰符_C#_Oop_Inheritance_Overriding - Fatal编程技术网

在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