达人高手解此override,new 死节

mazei 2006-08-16 04:59:03
代码1:求输出
using System;
using System.Collections.Generic;
using System.Text;

namespace JobTest1
{
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}

public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}

public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}

public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
}

代码2:将override改成了new
using System;
using System.Collections.Generic;
using System.Text;

namespace JobTest1
{
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}

public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}

public class B : A
{
public new void Fun1(int i)
{
base.Fun1(i + 1);
}

public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
}

当然,结果是可以运行出来的,俺笨,就是走不明白为什么会是这个结果,达人解之。先谢了
...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
deadshot123 2006-08-16
  • 打赏
  • 举报
回复
override 动态绑定,
new 可以隐藏父类的实现

比如一个接口或者父类

public abstract Father
{
public virtual void Test();
}

public class SunOne
{
public override void Test();
}

public class SunTwo
{
public new void Test();
}

Father fa1=new SunOne();
fa1.Test();//调用的是SunOne.Test();
Father fa2=new SunTwo();
fa2.Test();//调用Father.Test();
mazei 2006-08-16
  • 打赏
  • 举报
回复
通了死节:关键
a.Fun2(b);
而a中的方法为:Fun2(A a)
隐含的代码为:A a = b
a为A的一个实例,只不过是通过B来实例化罢了

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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