来自编程语言语用学,由Scott
派生类D具有其基础的所有成员 - 数据和子例程 C级。只要D不隐藏任何公开可见的 C的成员,允许使用D类对象是有意义的 在任何期望C类对象的上下文中:我们可能做的任何事情 我想对C类的对象做一个对象 D类。换句话说,一个不隐藏任何类的派生类 其基类的公开可见成员是该基类的子类型 类。
如果D
覆盖C
的公共方法,
D
的重写方法是否隐藏了C
的重写方法,D
成为C
的子类型的资格?什么可以使派生类隐藏基类的公共方法?
感谢。
答案 0 :(得分:2)
D
的重写方法是否隐藏了C
的重写方法
不,覆盖与隐藏不同,因为您提供替代实现而不是现有实现,而不仅仅是在没有任何替换的情况下删除实现。
大多数面向对象的语言都不允许隐藏指定用于覆盖(virtual
C ++,abstract
和virtual
C#的方法。有些语言根本不允许隐藏(Java)。这样做是为了确保从D
模型中继承C
"是-a"关系。
覆盖是否取消
D
成为C
的子类型的资格?
不,它没有。
答案 1 :(得分:2)
重写是否使D不能成为C的子类型?
这取决于。如果D中的方法违反了C中方法定义的契约,那么它将取消D作为子类型的资格。如果D方法支持相同的合同,那么它不支持。
我建议你阅读Liskov替代原则。这是她在1994年写的原始文章。它非常易读。