继承打破了封装性。子类依赖于超类中特定功能的实现细节。而超类的实现有可能会随着发行版本发生变化,那么子类就回被破坏。
覆盖动作可能会引起一系列的问题。只给子类增加新的方法,而不覆盖现有的方法,相对比较安全。但是也不是绝对安全。例如 父类被扩展命名了与子类重名的方法。
使用复合可以解决该问题,详细请见设计模式里的装饰者模式。用一个类把另外的类包装起来。
只有当子类真正是超类的子类型时,才适合用继承。