将方法声明为虚方法并将其隐藏在派生类中会发生什么
本文关键字:方法 什么 派生 隐藏 声明 | 更新日期: 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。