C#虚拟关键字

时间:2010-10-01 09:40:48

标签: c#

虚拟方法是否必须通过其子类覆盖?

9 个答案:

答案 0 :(得分:59)

如果方法不是虚拟(或抽象),则不能在子类中覆盖它。唯一的选择是使用new关键字来隐藏继承的方法,但这通常不是推荐的做法,因为将子类的实例强制转换为父类并调用该方法将导致父类改为调用的方法,这可能不是预期的功能。

所以简而言之,是的,它需要虚拟覆盖,但不,你不来覆盖它。如果不这样做,则将调用基类版本。但是如果你覆盖它,即使你将对象强制转换为它的基类类型,也会调用该方法的派生版本,这与使用new隐藏方法不同。

很高兴知道覆盖和隐藏方法之间的区别,因为乍一看,如果你测试它,它看起来可能会做同样的事情,但是当程序出现时会回来咬你按预期工作,你不知道为什么。

答案 1 :(得分:18)

不,当您使用“虚拟”关键字时,无论您是否要覆盖,都取决于您。使用“abstract”时,需要覆盖派生类中的方法。有关详细信息,请参阅:

答案 2 :(得分:11)

没有。 可以被子类覆盖,但不能

如果要强制执行子类覆盖,请在abstract类中使用abstract,或使用接口(意味着拥有来实现所有已声明的成员)。< / p>

答案 3 :(得分:10)

  

虚拟方法是否必须通过它的子类覆盖?

没有

  

我可以覆盖父类中NON-Virtual的方法吗?

没有

  

那是什么?

您必须实现父类的抽象方法(如果派生类是非抽象的)

  

我可以在静态方法上编写虚拟关键字

,因为这两个词恰好相反。虚拟意味着编译器在编译时不知道要调用哪个方法。静态意味着,您的编译器肯定知道将调用哪个方法。

  

如何将当前类的子类停止为不覆盖我的方法?

用密封关键字标记。

  

抽象方法也是虚拟的吗?

YES。这就是为什么我们不能明确地将抽象方法标记为虚拟的原因。

  

覆盖和重载是否相同?

当然不是!重载有两个具有相同名称的方法,但它们适用于不同的输入参数集。

  

何时将方法标记为虚拟?

当您使用多态并且您不确定对象的类型在运行时传递给您的方法,并且您希望子类具有不同的行为,然后将该方法标记为Virtual。 例如

class Law
{
 public void Punish(Minister any)
 {
    if (any.Corruption() == true)
      {
        ... do whatever public wants...
      }
 }
}

你有部长级别的部门 - 部长,中央政府部长,国家政府部长,地区权威部长等。你知道无论在部长级腐败()方法中定义的是什么,可以被许多派生阶级使用,但对于少数部长来说,腐败法律是不同的(他们拥有至高无上的权力!),所以你可以覆盖腐败()和你的派生类在其他任何地方使用部长级(所有部长的基础)中的腐败()的实现。

答案 4 :(得分:7)

是的,如果某个方法未标记为虚拟或抽象,则无法覆盖该方法。唯一的例外是在声明接口方法时不需要使用它,因为接口方法根据定义是虚拟的。实现此接口时,如果希望能够从实现接口的类派生并且能够覆盖该方法,则需要使用virtual或abstract。

答案 5 :(得分:3)

不必覆盖非抽象的虚拟方法。

除非您也将类标记为摘要,否则必须实现抽象方法。

答案 6 :(得分:3)

不,必须覆盖派生类中的虚方法。

答案 7 :(得分:2)

是覆盖您需要编写虚拟关键字。或写关键字抽象方法。

答案 8 :(得分:2)

不,这只是意味着你可以覆盖它,而不是你必须覆盖它。如果要使子类必须实现它,那么Abstract是关键字。