首页 新闻 会员 周边

请求高手指点代码的结果谢谢

1
悬赏园豆:10 [已解决问题] 解决于 2010-09-11 22:26
using System;

namespace Anytao.net.My_Must_net
{
  class Number
  {
  public static int i = 123;

  public void ShowInfo()
  {
  Console.WriteLine("base class---");
  }

  public virtual void ShowNumber()
  {
  Console.WriteLine(i.ToString());
  }
  }

  class IntNumber : Number
  {
  new public static int i = 456;

  public new virtual void ShowInfo()
  {
  Console.WriteLine("Derived class---");
  }

  public override void ShowNumber()
  {
  Console.WriteLine("Base number is {0}", Number.i.ToString());
  Console.WriteLine("New number is {0}", i.ToString());  
  }
  }

  class Tester
  {
  public static void Main(string[] args)
  {
  Number num = new Number();
  num.ShowNumber();
  IntNumber intNum = new IntNumber();
  intNum.ShowNumber();

  Number number = new IntNumber();
  //究竟调用了谁?
  number.ShowInfo();
  //究竟调用了谁?
  number.ShowNumber();
  }
  }
}
为什么是这样的结果

求高手指点下
后面三句代码不是很清楚
谢谢高手指点
龙翔~的主页 龙翔~ | 初学一级 | 园豆:190
提问于:2010-09-02 15:15
< >
分享
最佳答案
0
Number number = new IntNumber();
//究竟调用了谁? 调用基类ShowInfo new的作用是继承类向父类
隐藏重写方法。所以是调用父类的ShowInfo 方法
number.ShowInfo();
//究竟调用了谁? 这个是调用子类的方法,因为override 
已经重写了父类方法,所以调用子类的ShowNumber
number.ShowNumber();

 

收获园豆:5
jowo | 老鸟四级 |园豆:2834 | 2010-09-02 15:51
谢谢明白了很多
龙翔~ | 园豆:190 (初学一级) | 2010-09-02 15:54
其他回答(3)
0

其实在子类中用new和用override还是有点区别的:

如果你用new声明了一个与父类一模一样的方法,其实这个方法就专属于子类,跟父类的那个同名的方法没有任何关联,new嘛,本来就新创建的意思,就为了说明这是我新创建的方法,与你父类无关!如果你把子类当做父类用的话,也就是你上面的这行代码Number number = new IntNumber();那么其实number.ShowInfo()是调用的父类的,并不呈现出多态,和override还是不一样的!当然了,如果你是用子类的调用showInfo()的时候那肯定就是调用的子类的啦IntNumber n = new IntNumber();n.showInfo(),此时调用的子类的方法

总结一下:你用new声明的方法是把父类的方法隐藏了,但是你还是可以调用到的,那就是把子类当做父类来用

另外跟你说一下new和override的区别:

orverride声明的子类方法,父类必须是abstract或是viutual的,而new声明的话没有限制,也就是可以是虚方法也可以什修饰符都不加

收获园豆:5
yixin841210 | 园豆:1138 (小虾三级) | 2010-09-02 15:55
大哥真的非常感谢!小生明白许多了
支持(0) 反对(0) 龙翔~ | 园豆:190 (初学一级) | 2010-09-02 16:01
0

override可以覆盖基类的方法,让基类的方法以子类的内容实现,这是真正意义上的重载;而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已。

hovering | 园豆:38 (初学一级) | 2010-09-02 16:58
谢谢了
支持(0) 反对(0) 龙翔~ | 园豆:190 (初学一级) | 2010-09-02 17:00
0

其实这个代码你自己用断点一步一步跟踪一下就很容易明白谁调用了谁的

skyzhou | 园豆:288 (菜鸟二级) | 2010-09-03 09:11
嗯~谢谢!
支持(0) 反对(0) 龙翔~ | 园豆:190 (初学一级) | 2010-09-03 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册