请问 override 与 new 的区别 ???

mysky0103 2008-06-25 10:54:39
public class Base
{
public virtual void test()
{
Console.WriteLine("这是父类方法!");

}
}

public class Class1:Base
{
public override void test()
{
Console.WriteLine("这是CLASS1方法");
//base.test();
}
}

public class Class2 : Base
{
public new void test()
{
Console.WriteLine("这是Class2方法!");
//base.test();
}
}

Base b = new Base();
Class1 class1 = new Class1();
Class2 class2 = new Class2();
b.test(); //输出 这是父类方法
class1.test(); //输出 这是CLASS1方法
class2.test(); //输出 这个 Class2 方法
---上面的结果 说明 override 和 new 有达到了 重写的目的
参考 msdn
Base[] b = new Base[2];
b[0] = new Class1();
b[1] = new Class2();
foreach (Base bb in b)
{
bb.test();
}
输出结果是 : 这是CLASS1方法
这是父类方法 //主要 是这里不明白,为什么 又是调用的父类方法呢 ,明明 实列化 的new class2()
请高手释疑???


...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mysky0103 2008-06-27
  • 打赏
  • 举报
回复
多谢大家的回答,欢迎讨论
lextm 2008-06-25
  • 打赏
  • 举报
回复
如果有可能,建议lz仔细研究这方面的权威书籍,例如Effective C#。new关键字和override最大的不同在于,override是运行时绑定,因此调用b[0].test()时,会绑定到实际类型Class1的test上面,而new是编译期绑定,编译时就将b[1].test()绑定到了Base的test上面。

另外Effective C#提到了仅仅在一种实际情况下你可能会用到new,其他任何情况下面,请避免用它。
zzultc 2008-06-25
  • 打赏
  • 举报
回复
c#中关于new和override的语法就是这么定的,必须接受。
和C++中这一点确实不同。
cooolchen 2008-06-25
  • 打赏
  • 举报
回复
Base[] b = new Base[2];
b[0] = new Class1();
b[1] = new Class2();
foreach (Base bb in b)
{
bb.test();
}


你调试过这一段代码吗?你确定它是输出 “这是父类方法!”
s208ping 2008-06-25
  • 打赏
  • 举报
回复
如果你用override,则无论调用的是A类还是B类中的TEST(),系统都会找到它实质类的TEST();
如果是用的New,则可以通过类型转换调用到基类的TEST();

下面是override的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test();//调用A中Test();
b.Test();//调用B中Test();
a1.Test();//调用B中Test();系统会自动识别a1是B的实例
((A)b).Test();//与上面相同

下面是new的情况:
A a = new A();
B b = new B();
A a1=new B();
a.Test();//调用A中Test();
b.Test();//调用B中Test();
a1.Test();//调用A中Test();
((A)b).Test();//与上面相同
满衣兄 2008-06-25
  • 打赏
  • 举报
回复
Base b = new Base(); 的时候在内存中这个b的首地址已经被保存了,用override的时候把原来的对象覆盖了,而用new的时候是新创建了一个对象,当b[1] = new Class2(); 时只是在内存中添加了一个对象的地址,这个时候b的引用没变,依然是原来的b的地址,而不是新增的对象的地址.所以有了以上的结果.
lihongdian 2008-06-25
  • 打赏
  • 举报
回复
这是编译器优先级的原因,public new void test()是覆盖父类public virtual void test()方法.
而public override void test()是重写父类public virtual void test()方法.

当new class1()这个对象的时候,不论如何,都会先执行重写父类中test()方法的语句.
new class2()的时候不会执行public new void test()这句.因为你并没有调用真正意义上的class2()对象.
而是一个base对象而已...最起码编译译器的开发人员应该是这么理解的...所以你问的问题只有一个答案,就是你这么写编译器不会先覆盖父类中的方法,如果你一定要问为什么..那么就要到微软去把那个开发C#的人拖出来打一顿.
lihongdian 2008-06-25
  • 打赏
  • 举报
回复
因为你定义的是Base类型的对象,class1()重写了父类中的test()方法,而class2()没有重写.就这么简单.
lextm 2008-06-25
  • 打赏
  • 举报
回复
"编译器优先级",不知道是哪个书里的词汇。
大自然D使者 2008-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lihongdian 的回复:]
这是编译器优先级的原因,public new void test()是覆盖父类public virtual void test()方法.
而public override void test()是重写父类public virtual void test()方法.

当new class1()这个对象的时候,不论如何,都会先执行重写父类中test()方法的语句.
new class2()的时候不会执行public new void test()这句.因为你并没有调用真正意义上的class2()对象.
而是一个base对象而已...最起码编译译器的开发人员应该是这么…
[/Quote]
king2003 2008-06-25
  • 打赏
  • 举报
回复
就是这样的

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧