来自编程语言语用学,斯科特著
派生类D拥有它的基类C的所有成员--数据和子程序。只要D不隐藏任何公开可见的C成员,允许在任何期望类C对象的上下文中使用D类的对象是有意义的:我们可能想对C类的对象做的任何事情,我们也可以对类D的对象进行处理,换句话说,派生类不隐藏基类的任何公开可见成员就是这个基类的子类型。
如果D重写了C的公共方法,
D的重写方法是否隐藏了被重写的C方法,以及D作为C子类型的资格?是什么使派生类隐藏基类的公共方法?
谢谢。
发布于 2017-10-01 22:23:14
D的重写方法是否隐藏了C的重写方法?
不,重写与隐藏不同,因为您提供的是替换实现,而不是现有的实现,而不仅仅是删除没有任何替换的实现。
大多数面向对象语言不允许隐藏指定用于重写的方法(virtual of C++,abstract和virtual of C#)。有些语言根本不允许隐藏(Java)。这恰恰是为了确保从D模型继承C是-一种关系。
重写是否取消了
D作为C的子类型的资格?
不,不需要。
发布于 2017-10-02 01:29:10
覆盖是否使D不再是C的子类型?
那得看情况。如果D中的方法违反了C中的方法定义的契约,那么是的,它将取消D作为子类型的资格。如果D方法支持相同的契约,那么它就不支持。
我建议你读一读利斯科夫替代原则。这是她1994年写的一篇文章。可读性很强。
subtypes.pdf
https://stackoverflow.com/questions/46517416
复制相似问题