对象的类和对象的类型

理解对象的类(class)与对象的类型(type)之间的差别非常重要。

对象的类:定义了对象是怎样实现的, 同时也定义了对象的内部状态和操作的实现。
对象的类型:对象的类型只与它的接口有关, 接口即对象能响应的请求的集合。一个对象可以有多个类型, 不同类的对象可以有相同的类型。

原则性知识点:

1. 针对接口编程,而非实现编程

  • 类继承是一个通过复用父类功能而扩展应用功能的基本机制

    它允许你根据旧对象快速定义新对象。
    允许你从已存在的类中继承所需要的绝大部分功能, 从而几乎无需任何代价就可以获得新的实现。

然而, 实现的复用只是成功的一半, 继承所拥有的定义具有相同接口的对象族的能力也是很重要的 (通常可以从抽象类来继承)。
为什么?
因为多态依赖于这种能力。

  • 当继承被恰当使用时, 所有从抽象类导出的类将共享该抽象类的接口**

这意味着子类仅仅添加或重定义操作, 而没有隐藏父类的操作。这时, 所有的子类都能响应抽象类接口中的请求, 从而子类的类型都是抽象类的子类型。
只根据抽象类中定义的接口来操纵对象有以下两个好处:

  1. 客户无须知道他们使用对象的特定类型, 只须对象有客户所期望的接口。
  2. 客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义接口的抽象类。这将极大地减少子系统实现之间的相互依赖关系, 也产生了可复用的面向对象设计的如下原则:

2. 优先使用对象组合, 而不是类继承

对象组合是通过获得对其他对象的引用而在运行时刻动态定义的

组合要求对象遵守彼此的接口约定, 进而要求更仔细地定义接口, 而这些接口并不妨碍你将一个对象和其他对象一起使用。
这还会产生良好的结果: 因为对象只能通过接口访问, 所以我们并不破坏封装性;
只要类型一致, 运行时刻还可以用一个对象来替代另一个对象; 更进一步, 因为对象的实现是基于接口写的, 所以实现上存在较少的依赖关系。


对象组合对系统设计还有另一个作用, 即优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模, 并且不太可能增长为不可控制的庞然大物。另一方面, 基于对象组合的设计会有更多的对象(而有较少的类), 且系统的行为将依赖于对象间的关系而不是被定义在某个类中。

3. 封装变化

4. 尽可能努力的实现松耦合

5. 类应该对扩展开放,修改关闭

修改原有代码意味着引入bug,我们尽可能的能够实现扩展功能放在新增代码中而不去影响旧代码。

  1. 对扩展开放即表示开发中支持新增功能,但是以新增代码的形式,不会影响到旧代码的功能,
  2. 修改关闭即表示减少修改旧代码如类内部结构、算法内部实现等形式,这种属于破坏式编程
  3. 注意:要有度,不是说任何地方都要遵循开闭原则,尽可能找到需要改变的地方,遵循开闭原则,无差别力争实现此原则是一种浪费。

6. 依赖倒置原则

尽可能减少对具体实现的依赖
依赖倒置意味着不能让高层组件依赖底层组件,且两者都应依赖于抽象。
高层:可以比喻成抽象类
底层:可以比喻成实现类
什么是倒置,我觉得主要是考虑问题不再是从如何创建具体的实现开始,去一步步依赖实现,而是懂得抽象,将那些具体的实现抽象公共点,实现方面变成依赖这些抽象的公共点,之前是依赖具体实现,而现在是依赖抽象的公共点,最终再去根据公共点完成具体的实现,这种思考方法的倒置。

如何避免或者确认自己是否违背了依赖倒置原则:

  1. 变量不可以持有具体类的引用
  2. 不要让类派生自具体类
  3. 不要覆盖基类中已经实现的方法

如果覆盖基类已经实现的方法,那么此基类就不是一个真正适合被继承的抽象,基类已实现的方法,应该由所有子类共享

7. 最小知识原则

作者:admin  创建时间:2023-11-29 20:02
最后编辑:admin  更新时间:2025-02-10 11:18