覆盖
请看以下代码:
public class A {
public virtual void say() {
Console.WriteLine("i m father");
}
}
public class B : A{
public override void say() {
Console.WriteLine("i m child");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
b.say();
A a = new A();
a.say();
a = b;
a.say();
A aa = new B();
aa.say();
}
}
子类B继承基类A,两者都有say方法,当基类A中将say方法声明为virtual虚函数同时子类B中用override覆盖say方法时,运行结果如下:

隐藏
当基类A的say方法去掉virtual修饰,子类B的say方法也去掉override修饰时:
public class A {
public void say() {
Console.WriteLine("i m father");
}
}
public class B : A{
public void say() {
Console.WriteLine("i m child");
}
}
运行结果如下:

当将b对象赋给a时,a并没有使用b的say方法。
更规范应该给B类中的say方法加上new修饰符:
public class A {
public void say() {
Console.WriteLine("i m father");
}
}
public class B : A{
public new void say() {
Console.WriteLine("i m child");
}
}
结果如下:

本文探讨了C#中方法覆盖与重载的区别,通过具体代码示例展示了如何使用virtual和override关键字实现多态性,以及在不同情况下new关键字的作用。
297

被折叠的 条评论
为什么被折叠?



