1 C#基础virtual,override和new的区别1_m0_55413404的博客-CSDN博客
2 C#基础virtual,override和new的区别2_m0_55413404的博客-CSDN博客
3 C#基础virtual,override和new的区别3_m0_55413404的博客-CSDN博客
4 C#基础virtual,override和new的区别4_m0_55413404的博客-CSDN博客
5 C#基础virtual,override和new的区别5(试题训练)_m0_55413404的博客-CSDN博客
class Program
{
static void Main(string[] args)
{
A2 ab = new B2();
ab.Method();
A2 ac = new C2();
ac.Method();
A2 ad = new A2();
ad.Method();
B2 ae = new B2();
ae.Method();
}
//创建基类以及派生类
public class A2
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B2 : A2
{
public new void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
public class C2 : A2
{
public override void Method()
{
Console.WriteLine("This Method in Class C!");
}
}
运行结果:
分析:父类virtual.,派生类override会覆盖掉基类的方法,直接走派生类。
父类virtual,而new则不会覆盖基类方法。所以还是走基类的方法。
注:声明为父类,实例化为子类的对象,执行该对象(父类)的方法时如果父类中存在Virtual,会先去实例化的子类中寻找override的该方法,如果存在,则覆盖父类执行子类的方法。而new是子类中完全不同于父类的方法,方法名一样,但其实是两个方法。所以对于有new没有override的方法,会执行父类的方法。
延伸:实例化一个对象的过程,是去访问该对象构造函数的过程。如果该对象有父类,则实例化时,会向上探测,执行最外层的父类的构造函数,依次向下走该子类,子类的子类。。。的构造函数。
A2 ad = new A2();B2 ae = new B2();方法不在构造函数里面,与父类无关,所以A2执行结果为A2,B2执行结果为B2,具体构造函数里面的方法执行区别可以看第三篇。
下一篇 基类派生类进阶