C#虚拟关键字

Nov*_*Net 37 c#

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

Øyv*_*hen 61

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

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

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

  • 差异(除其他外)是你有一个A类是一个基类而B是一个派生类,它们都有一个名为Test的方法.它在A中不是虚拟的,但它在B中写成了public new void Test.然后你创建一个B的对象,然后编写B.Test.派生类Test按预期运行.如果您改为生成B的对象并将其转换为A(从B派生出A后允许)并调用已转换的B的Test方法,实际上调用了Test的基类实现,这通常不是您想要的.如果使用virtual/override,则在两种情况下都会运行派生的Test. (4认同)

sum*_*mer 19

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

  • 如果派生类是从absract基类派生的*不是抽象*类,则只需要*来覆盖派生类中的抽象方法. (6认同)

Ode*_*ded 11

不,它可以通过一个子类中重写,但不具备如此.

如果要强制执行子类覆盖,请abstractabstract类中使用,或使用接口(意味着必须实现所有声明的成员).

  • 请注意,要将方法标记为抽象,您还必须将类标记为抽象,因此,如果要创建主类和派生类的对象,则不能强制使用子类来覆盖该方法.它是另一种确保类实现一组特定方法的接口. (2认同)

Dha*_*jay 10

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

没有.

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

没有.

什么是YES呢?

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

我可以在静态方法上编写Virtual关键字吗?

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

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

用密封关键字标记它.

抽象方法是虚拟的吗?

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

覆盖和重载是否相同?

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

我何时将方法标记为虚拟?

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

class Law
{
 public void Punish(Minister any)
 {
    if (any.Corruption() == true)
      {
        ... do whatever public wants...
      }
 }
}
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*rov 7

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