黑马程序员技术交流社区
标题:
override和new的区别
[打印本页]
作者:
fcyan86
时间:
2013-6-5 10:20
标题:
override和new的区别
本帖最后由 fcyan86 于 2013-6-5 16:09 编辑
代码:
class Program
{
static void Main(string[] args)
{
B b=new B();
b.M();
C c=new C();
c.M();
A a;
a = b;
a.M();
a = c;
a.M();
/*
* 输出结果如下:
* New B.M
* override C.M
* A.M
* override C.M
*/
}
}
class A
{
public virtual void M()
{
Console.WriteLine("A.M");
}
}
class B:A
{
public new void M()
{
Console.WriteLine("New B.M");
}
}
class C:A
{
public override void M()
{
Console.WriteLine("override C.M");
}
}
复制代码
那么问题是:使用override重写时,是将父类中的虚方法重写了。当使用new将父类的方法隐藏,那么当如上面代码所示,当进行:a=b;运算时是不是隐含的类型转换将B类转换为A类时,同时会将B类中new出的M方法丢失,还是根new父类的方法一样,将子类中的该方法隐藏。
作者:
关关雎鸠
时间:
2013-6-5 13:21
确实隐式的转换了,new并没有覆盖(重写)父类方法,所以调用了A.M;而C重写了A的方法,要访问的父类的方法需要用base.M()才行。
作者:
李晶晶
时间:
2013-6-5 15:11
A a;
a = b;
a.M();
等价于:
A a = new B();
a.M();
如果调用a.M(),程序就会先调用A类的M方法,发现A类的M方法是虚拟的,同时又发现‘a’又指向了B类,所以程序又会查看B类的M方法,发现没有被重写,所以就输出了A的方法。
作者:
袁梦希
时间:
2013-6-5 15:15
提问的很详细 不错
作者:
fcyan86
时间:
2013-6-5 16:08
B b=new B();
b.M();
C c=new C();
c.M();
A a;
a = b;
a.M();
a = c;
a.M();
B b1 = (B)(a = b);
b.M();
C c1 = (C) (a = c);
c1.M();
/*
* 输出结果如下:
* New B.M
* override C.M
* A.M
* override C.M
* New B.M
* override C.M
*/
复制代码
运行试了试,看运行结果应该是子类转换为父类时,子类并没有丢失任何数据。学习了………………
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2