1.5 什么可以作为类
C++面向对象高效编程(第2版)
用简单的例子详细讨论类和对象非常容易,但是难点在于如何为给定的问题找出合适的类。我们必须理解类代表什么,何时将问题中的某些部分转化为类,而非数据,反之亦然。根据我们的定义,类拥有一组对象的共同属性(或者特性)。怎样的共同才是共同?何时说这是一个类,而不是另一个类的对象?这些都是我们在学习OOP时会遇到的,和真正关心的问题。
当我们决定创建一个类时,第一个问题就是“是否确实需要这个类的多个实例?”,如果答案为“是”,那么我们的方法就可能正确至少粗略看起来正确。如果发现类的实例之间没有绝对差别(也就是说,每个实例和其他实例相同,而且它们的行为完全一致),那么,我们可能错误地创建了这个类,应该将这个类创建为一个值。例如,如果在处理鲜花问题时将Color作为类,而每种颜色都可以用唯一的数字代表,那么,将Color设计成一个类就毫无意义。但是,如果我们在图形系统中处理颜色(涉及复杂的颜色计算),则必须将Color定义为类,因为基于颜色的组成(红色、绿色和蓝色),每种颜色都具有许多成分和深浅变化。更重要的是,可以通过控制Color的成分来控制颜色。这说明,在图形系统中,Color不仅仅是一个值,它还包含许多依附于它的行为。
再来看看另一个例子,家庭地址(或者Address)可能被看做是字符(或者值)数组。但是,Address在电子邮件系统中可能是一个类,它包括域名、计算机名称等,而且地址还反映了用于消息传送的路由性质。很明显,在这样的系统中,我们不能将地址作为字符数组,它是一个真正的类。
记住,不可能一次设计就能一步到位。在第一轮设计中作为类的部分,可能在第二轮设计中改为数据,反之亦然。解决问题的方案在不断变化,最终的解决方案很可能与最初设计截然不同。
这都源于类的重要特性。类不只是容器,不能认为它仅仅用于存储被函数修改的数据。类为客户提供了复杂实体的简化版本,并允许客户通过操作类的对象完成有用的工作。类不只是将它的各个部分简单地组合起来而已。类决定如何完成任务,它清楚地陈述了该类的对象可以做什么。回顾Color的例子,如果在图形系统中,只有红色、绿色和蓝色,对客户而言意义不大。Color类需要完成的任务是将各种颜色成份组合起来,并为其添加值来表现这些颜色。同理,银行账户不能只包含字符和浮点数字,银行账户类应该允许客户更加方便、安全地管理他们的金钱。