重写是否取消派生类是否为其基类的子类型?

时间:2017-10-01 22:16:09

标签: oop inheritance programming-languages computer-science subtype

来自编程语言语用学,由Scott

  

派生类D具有其基础的所有成员 - 数据和子例程   C级。只要D不隐藏任何公开可见的   C的成员,允许使用D类对象是有意义的   在任何期望C类对象的上下文中:我们可能做的任何事情   我想对C类的对象做一个对象   D类。换句话说,一个不隐藏任何类的派生类   其基类的公开可见成员是该基类的子类型   类。

如果D覆盖C的公共方法,

  • D的重写方法是否隐藏了C的重写方法,
  • 覆盖是否取消D成为C的子类型的资格?

什么可以使派生类隐藏基类的公共方法?

感谢。

2 个答案:

答案 0 :(得分:2)

  

D的重写方法是否隐藏了C的重写方法

不,覆盖与隐藏不同,因为您提供替代实现而不是现有实现,而不仅仅是在没有任何替换的情况下删除实现。

大多数面向对象的语言都不允许隐藏指定用于覆盖(virtual C ++,abstractvirtual C#的方法。有些语言根本不允许隐藏(Java)。这样做是为了确保从D模型中继承C"是-a"关系。

  

覆盖是否取消D成为C的子类型的资格?

不,它没有。

答案 1 :(得分:2)

  

重写是否使D不能成为C的子类型?

这取决于。如果D中的方法违反了C中方法定义的契约,那么它将取消D作为子类型的资格。如果D方法支持相同的合同,那么它不支持。

我建议你阅读Liskov替代原则。这是她在1994年写的原始文章。它非常易读。

http://www.csnell.net/computerscience/Liskov_subtypes.pdf