class A {
public virtual void Foo()
{ // do something
}
}
class B:A {
public void Foo() {
}
}
这是什么意思?谁能举个例子?到目前为止,我认为如果你使用虚拟,必须使用“override”关键字 感谢
答案 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被调用。