A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贡宗新 中级黑马   /  2013-5-10 15:07  /  1418 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贡宗新 于 2013-5-12 13:39 编辑

有时候这种迷惑人的问题真让人头晕,大家帮忙分析一下,

不使用多态的时候:
  1. class A
  2.     {
  3.         public void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Program p = new Program();
  13.             p.Fun();
  14.             Console.Read();
  15.         }
  16.     }
  17. //结果为:I am F
复制代码
使用new来隐藏父类方法,所以调用的时候就直接调用子类方法:
  1. class A
  2.     {
  3.         public void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         public new void Fun()
  11.         {
  12.             int i = 1;
  13.             Console.WriteLine("I am F,i={0}", i);
  14.         }
  15.         static void Main(string[] args)
  16.         {
  17.             Program p = new Program();
  18.             p.Fun();
  19.             Console.Read();
  20.         }
  21.     }
  22. //结果为:I am F,i=1
复制代码
当使用虚方法重写时:也是直接调用子类方法
  1. class A
  2.     {
  3.         public virtual void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         public override void Fun()
  11.         {
  12.             int i = 1;
  13.             Console.WriteLine("I am F,i={0}", i);
  14.         }
  15.         static void Main(string[] args)
  16.         {
  17.             A p = new Program();
  18.             p.Fun();
  19.             Console.Read();
  20.         }
  21.     }
  22. //结果是I am F,i=1;
复制代码
但是,当父类是虚方法,子类是new(隐藏了父类方法,不知道这样说准不准确):结果为什么是父类的结果:不明白???
  1. class A
  2.     {
  3.         public virtual void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         public new void Fun()
  11.         {
  12.             int i = 1;
  13.             Console.WriteLine("I am F,i={0}", i);
  14.         }
  15.         static void Main(string[] args)
  16.         {
  17.             A p = new Program();
  18.             p.Fun();
  19.             Console.Read();
  20.         }
  21.     }
  22. //结果为 I am F
复制代码
当基类函数是虚函数时,子类函数不是重写,而是覆盖了基函数的同名函数。这句话怎么理解

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

3 个回复

倒序浏览
占楼,坐等达人回答问题
回复 使用道具 举报
    当基类中不是虚函数时 A a=new Program();调用的是A中定义的Fun。这显然不是我们想要的结果。因为a现在指向的是一个Program对象,理应调用Program中的Fun方法。   
    解决办法如你所做的,将基类A的Fun生命为virtual,这时候Program中的Fun就将A中的Fun给覆盖了(换句话说Program中的Fun把A中的Fun给遮住了,A中的Fun看不见了)所以此时调用的是Program中的Fun.

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
重写,需要在父类的方法前加修饰符virtual,子类的方法前加修饰符override,
加new只是显示隐藏这个父类的方法,不加则是隐式隐藏这个父类的方法,
根据类型还是可以访问指定的方法,但重写之后,就只看重写之后的方法了。
:)

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马