
2.1 清楚接口和实现之间的区别
正如第1章中所示,构建健壮的面向对象设计的关键之一是理解接口和实现之间的不同。因此,当设计类时,应该向用户暴露什么,隐藏什么是非常重要的。而封装与生俱来的数据隐藏机制可以对用户隐藏不必要的数据。
小心
不要混淆接口与图形化用户接口(Graphical User Interface,GUI)这两个概念。虽然GUI名称中包含了interface这个单词,但是我们所说的接口是一种更通用的术语,它并不局限于图形化接口。
还记得第1章中的烤面包机例子吗?烤面包机(或相似功能的设备)需要插入一个接口,即电源插座,如图2.1所示。所有需要电的设备都需要遵从正确的接口,即电源插座。烤面包机不需要知道插座的任何实现,或者电是如何产生的。对所有烤面包机而言,它不关心电是燃煤电厂还是核电站生产的,只关心具体接口可以正确安全地工作就行。

图2.1 再访发电厂
还有一个汽车的例子。司机和汽车之间具有很多接口,比如方向盘、油门踏板、刹车和点火开关。先抛开美观问题,大多数人开车时主要关注的点是启动、加速、停止、转向等,很少有人关心那些眼睛看不到的组件(实现)。事实上,大多数人根本就无法识别某些组件,比如催化转化器和垫圈。然而,任何司机都必须清楚如何使用方向盘,因为这是一个通用接口。制造厂商会为车安装一个标准的方向盘,确保市场上的目标客户都能够使用这个系统。
然而,如果制造厂商决定安装一个操纵杆来代替方向盘,大多数司机都会不习惯,那么这个车型销量不会很广(只能博得一些喜欢打破常规的人的喜爱)。而如果制造厂商替换了汽车的引擎(改变了部分实现),只要没有改变性能和外观,大多数司机都不会注意到。
只要接口不变,可互换的引擎在任何方面必须严格一致。把四缸发动机替换为八缸发动机可能会改变接口规则,导致需要使用该引擎接口的其他组件不能正常工作。就如同在发电厂例子中把交流电(AC)改成直流电(DC)也会影响接口规则一样。
引擎属于实现,方向盘属于接口。改变实现不会对司机造成影响,而改变接口则会。司机会注意到方向盘的外观变化,即使改变可能很微小。必须强调的是对引擎的改变不应让司机注意到,否则就会破坏规则。例如,改变引擎可能会丧失动力,事实上影响了接口。
用户能看到什么
本章中当我们讨论用户时,我们主要指设计人员和开发人员,没必要引入终端用户。因此,在此上下文中讨论接口时,我们讨论的是类接口,而不是GUI。
正确地设计类时要注意两部分,即接口和实现。