将方法声明为虚方法并将其隐藏在派生类中会发生什么

本文关键字:方法 什么 派生 隐藏 声明 | 更新日期: 2023-09-27 18:13:45

  class A {
      public virtual void Foo()
           { // do something
            }
    }
  class B:A {
      public void Foo() {
       }
    }

这是什么意思?谁能给我举个例子?到目前为止,我认为这是强制性的使用"覆盖"关键字,如果你使用虚拟由于

将方法声明为虚方法并将其隐藏在派生类中会发生什么

如果您使用这样的声明,您将只是使用B类的实例"隐藏"A类的Foo方法。当您将此实例强制转换为A并调用Foo时,将调用A类的方法。

如果您将在B类中使用override,那么如果您创建B的实例,然后强制转换为A,则将使用B类的Foo方法。

class A
{
    public virtual void Foo()
    {
        Console.WriteLine("A Foo");
    }
}
class B : A
{
    public void Foo()
    {
        Console.WriteLine("B Foo");
    }
}
B b = new B();
b.Foo(); // call 'B Foo'
A a = (A)b;
a.Foo(); // call 'A Foo'
与覆盖:

B b = new B();
b.Foo(); // call 'B Foo'
A a = (A)b;
a.Foo(); // call 'B Foo'

关于细节,你可以谷歌一下。c#中的多态性,方法隐藏和重写

new关键字可能会给您带来更好的理解。当你在类中定义一个方法时,默认情况下它是new(如果你没有用抽象/虚拟/覆盖/等标记它),这意味着这个方法与基类中定义的方法没有任何关系,无论它们具有相同的名称。

 class A 
 {
     public virtual void Foo() { }
 }
 class B : A 
 {
     public new void Foo() { }
     public new void Bar() { }
     public void Baz() { }   //it's also new
 }

现在假设有B b = new B();。如果你被问到b.Bar()会调用哪个方法,你会给出正确的答案:B类中的Bar方法。但如果问题是关于b.Foo()的,你可能会感到困惑,只是认为它是B中的新方法,而不关心a中的那些方法。b.Baz()也是如此。

EDIT现在A a = new B();来了。如果a.Foo()会发生什么?只需考虑B中定义的Foo与A无关,因为A被定义为A,因此调用A中的方法Foo。