1.2 每个对象都有一个接口
抽象数据类型(类)的运行方式与内置(built-in)类型几乎完全一致。
一个类实际上就是一个数据类型。二者的差异在于,程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型。
面向对象程序设计的一个挑战之一,就是在问题空间中的元素和解空间的对象之间创建一对一的映射。
接口确定了对某一特定对象所能发出的请求。
1.3 每个对象都提供服务
程序设计思路:将对象想象为“服务提供者”。程序本身向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或者最好是在现有的代码库中寻找)能够提供理想的服务来解决问题的一些列对象。也就是把问题分解成相关管理的对象集合。
将对象看作服务提供者,有助于提高对象的内聚性。
每个对象都可以很好地完成一项任务,但是它并不是图做更多的事。
1.4 被隐藏的具体实现
将开发人员按角色分为类创建者和客户端程序员是大有裨益的(注:以前学习时没学好主要是一人担任了两个角色,这对代码设计不利,因为这是两种不同的思维模式,以后的教学实践中要注意。类创建者关注功能实现,而客户端程序员关注服务——只需要必需的服务并且只关注结果)。客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标是构建类。
为什么需要访问控制?
1. 让客户端程序员无法触及他们不应该触及的部分——这部分对数据类型的内部操作来说是必需的,但并不是用户解决特定问题所需的接口的一部分,
2. 允许库设计中可以改变类内部的工作方式而不用担心会影响到客户端程序员。
如果接口和实现可以清晰地分离并得以保护,那就就可以轻而易举地完成访问控制。
访问权限关键字
public 紧跟其后的元素对任何人都可以使用;
private 除了类型创建者和类型内部方法之外的任何人都不能访问的元素;
protected 和private 相当,差别仅在于继承的类可以访问protected成员;
默认访问权限,也称包访问权限,可以访问同一个包中的其他类的成员,在包之外,如同private一样。
1.5 复用具体实现(组合与继承)
创建一个成员对象,这种方式成为组合(composition)。如果组合是动态发生的,那么通常被称为聚合(aggregation)。组合被视为“has-a”(拥有)关系。
新类的成员对象通常都被声明为private,组合具有很大的灵活性,在创建新类时,应该首先考虑组合。