黑马程序员技术交流社区

标题: 重写和隐藏 [打印本页]

作者: 崔增阳    时间: 2014-3-24 21:59
标题: 重写和隐藏
本帖最后由 崔增阳 于 2014-3-25 19:12 编辑

请问重写override和隐藏new有什么区别?
作者: 张变    时间: 2014-3-24 22:11
父类引用指向子类对象时 ,Base b=new Sub();
若子类override 父类的方法,当b.子类方法() 调用时,执行的是覆盖父类的子类的方法体
若子类new 父类的方法,当b.子类方法()调用时,执行的是被隐藏的父类的方法体
作者: cancle    时间: 2014-3-25 09:18
override是子类重写了父类的方法,但是父类还可以调用自己的方法
而隐藏new则是子类隐藏了父类的方法,父类自己的方法调用不到了
作者: 百川    时间: 2014-3-25 10:45
new为显式隐藏父类方法,override是重写。
隐藏父类方法执行里氏转换后会执行父类方法。如:
Base b=new Sub();执行父类方法。
重写时,执行里氏转换后,会根据父类中子类对象的不同执行不同的方法。如:
Base b=new Sub1();
Base b=new Sub2();分别执行Sub1和Sub2的方法。
作者: 心灵苦旅    时间: 2014-3-25 13:31
参照下面的代码看看:
  1.     class A
  2.     {
  3.         public void F()        //非虚方法
  4.         { Console.Write(" A.F"); }

  5.         public virtual void G()        //虚方法
  6.         { Console.Write(" A.G"); }
  7.     }
  8.     class B : A        //A类为B类的基类
  9.     {
  10.         new public void F()        //重写基类的同名非虚方法F(),使用new
  11.         { Console.Write(" B.F"); }

  12.         public override void G()        //覆盖基类的同名虚方法G(),使用override
  13.         { Console.Write(" B.G"); }
  14.     }
  15.     class Test
  16.     {
  17.         static void Main()
  18.         {
  19.             B b = new B();
  20.             A a = b;        //因为B类继承于A类,所以可以用 A类的引用变量 来引用 B类的对象
  21.             //也就相当于
  22.             //int i;
  23.             //object ob = i;

  24.             a.F();        //F()在派生类中被new重写了,但在此还是调用基类A的F(),显示A.F

  25.             a.G();        //G()在派生类中被override覆盖,也就隐藏了基类的G()方法,
  26.          //所以调用的是派生类B中的G(),显示B.G
  27.         }
  28.     }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2