主要观点:
- 类 Car 实现接口 Vehicle ,接口在常规代码中工作良好,但在继承方面存在问题,如用户不能编写可从任何 Vehicle 继承的通用类,Car 实现者不能限制子类仅通过 Vehicle 接口使用 Car 。
- 由于 Car 不能限制子类仅使用接口,子类可能违反 Car 的内部不变量,要么禁止继承,要么需另一种方式定义对子类有效的接口,即访问修饰符(public、protected、private)。
- 访问修饰符原本在 Simula 中发明,发明者和用户未意识到其重复了已有的接口定义功能,在没有继承时,若有接口,访问修饰符无额外实现隐藏能力。
- 在 Simula 中,访问修饰符有用是因为其发明并大量使用了继承,需要保护基类的实现内部,但本可利用 Simula 已有的接口能力。
- 未来可通过不使用访问修饰符来改进,若类不可被继承且按特定方式限制构造,无需用访问修饰符,应通过定义接口来保护类内部。若要继承非抽象类,应使用组合而非继承,因为继承起初是一种权宜之计。
关键信息:
- 接口在常规使用和继承方面的不同表现及问题。
- 访问修饰符的发明及在 Simula 中的情况。
- 关于类继承和接口定义的各种讨论及建议。
重要细节:
- 如用户可写通用代码用于任何 Vehicle 并使用 Car ,Car 实现者可通过特定函数限制用户仅使用 Car 实例等。
- 提到访问修饰符可定义影响子类的伪接口,包含 Car 的公共和受保护成员。
- 指出访问修饰符在 Simula 中因继承而有用,本可利用已有接口能力。
- 建议若类不可继承且限制构造,无需用访问修饰符,应定义接口保护内部。
- 强调若要继承非抽象类应使用组合。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。