New与override区别

发布时间 2023-08-14 22:11:37作者: 木影**凌翔

New与Override区别

New(隐藏)

new是指“隐藏”,是指子类隐藏了父类的方法,当然,通过一定的转换,可以在子类的对象中访问父类的方法。

  1. new是派生类用来隐藏基类中的方法的;也就是说在派生类中“看不到”基类中的方法;

  2. 如果要在派生类中隐藏(不是重写)基类中的方法,而没有使用new关键字,编译时会出现一个警告,提示如果是要隐藏基类中的方法,请使用new关键字;

  3. 派生类可以隐藏基类中的虚方法,也可以隐藏基类中的普通方法。

  4. 如果在派生类中用private来修饰new 方法,那么只在该派生类中隐藏了基类中的方法,在该派生类之外,相当于没有隐藏基类中的方法;

  5. 如果在派生类中隐藏了基类中的方法,在该派生类的派生类中,将延续对该派生类对基类方法的隐藏。

Override(覆盖)

override是指“覆盖”,是指子类覆盖了父类的方法。子类的对象无法再访问父类中的该方法。

  1. override是派生类用来重写基类中方法的;

  2. override不能重写非虚方法和静态方法;

  3. override只能重写用virtual、abstract、override修饰的方法;

  4. 不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

总结

共同点

  1. 它们都是子类在用某种方式来“隐藏”父类的同名方法
  2. 在子类对象上调用这个方法,会实际调用子类的“新”方法,而非基类的方法
  3. 它们都可以在方法中使用base来调用基类的方法

不同点

  1. override会真正覆盖掉基类的方法,使它再无可能被调用到;而 new 则只是将基类方法进行了隐藏
  2. override关键字必须要写明; new则并不必须,相当于在表明自己很清楚是在试图隐藏基类方法

如何选择

  1. virtual 标记的方法就意味着这个方法有很大可能性会在子类中被覆写,并提供更具体目有意义的实现。基类中的 virtual 方法通常只给出最基本且很可能不完整的实现,通常只是用来辅助子类的覆写。一旦子类给出了更好的实现,那么基类的方法并不应该希望被调用。
  2. 基类的普通方法在设计时并不打算让子类进行覆写,因为这些方法通常已经是完整且有意义的。只有当子类希望对某个基类方法进行进一步定制时,才会考虑用 new这种方式来显式隐藏基类的方法。但基类的方法仍然是有意义且可以被调用的。
  3. 简单来说,如果你想“覆盖”基类的某个方法,但是该方法并不是 virtual 时,你才需要考虑用 new