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()
请高手释疑???
{
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()
请高手释疑???
解决方案 »
- asp.net 后台获取前台信息
- 修改一下有关正则应用
- iframe问题
- 怎么给asp.net 中的panel控件的背景图片设为自动适用panel的大小
- asp.net读写EXCEL文件的怪问题
- 有關在VS2005中dataview如何實現類似window中的排序
- 为何datalist不能全部显示数据表中的所有记录?
- 我用c#做了一个同学录,大家评价一下啊!
- 多条件分页查询该如何设计缓存
- asp.net用httpwebrequest登录其他网站之后如何跳转到其他网站并保持登录状态
- 想用Reflector来保护我的dll,请问具体Reflector怎么操作才能保护起来
- 请教webrequest 问题,问题明细见内容
而public override void test()是重写父类public virtual void test()方法.当new class1()这个对象的时候,不论如何,都会先执行重写父类中test()方法的语句.
new class2()的时候不会执行public new void test()这句.因为你并没有调用真正意义上的class2()对象.
而是一个base对象而已...最起码编译译器的开发人员应该是这么理解的...所以你问的问题只有一个答案,就是你这么写编译器不会先覆盖父类中的方法,如果你一定要问为什么..那么就要到微软去把那个开发C#的人拖出来打一顿.
如果是用的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();//与上面相同
b[0] = new Class1();
b[1] = new Class2();
foreach (Base bb in b)
{
bb.test();
}
你调试过这一段代码吗?你确定它是输出 “这是父类方法!”
和C++中这一点确实不同。