在声明一个方法虚拟并将其隐藏在派生类中时会发生什么?

时间:2011-11-07 10:14:39

标签: c#

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

  class B:A {
      public void Foo() {
       }
    }

这是什么意思?谁能举个例子?到目前为止,我认为如果你使用虚拟,必须使用“override”关键字 感谢

2 个答案:

答案 0 :(得分:2)

如果您使用此类声明,则只需使用Foo类的实例“隐藏”A类的B方法。当您将此实例投射到A并调用Foo时,将调用A类的方法。

如果您在课程override中使用B,那么如果您创建Foo的实例,则会使用B类的B方法,然后转为A

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'

有关详情,您可以谷歌一点。例如,这篇文章:Polymorphism, Method Hiding and Overriding in C#

答案 1 :(得分:0)

new关键字可能会让您更好地理解。在类中定义方法时,默认情况下为new(如果未使用abstract / virtual / override / etc标记),这意味着此方法与基类中定义的方法无关,无论他们有相同的名字。

 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类中的方法栏。但如果问题是b.Foo(),你可能会感到困惑,只是认为它是新的B,不关心A.中的那些方法。b.Baz()也是如此。

编辑现在来A a = new B();。如果a.Foo()会怎样?只要认为B中定义的Foo与A没有业务关系,因为a被定义为A,A中的方法Foo被调用。