面向对象编程——类与对象
许多开发人员可能会认为"一个包含了另一个对象的对象",其本质上与"一个具有纯数据成员的对象"是完全不同的,但是那些看起来不是对象的数据成员实际上也是对象,比如,整数和双精度数。在真正的面向对象语言中,万事万物都是对象,甚至内置数据也是对象,即使其行为只是运算。
由此可见,虽然对象是具有明确定义的边界的东西,但还不足以区分不同的对象。因为同一个类的每个对象具有不同的句柄,在任何特定时刻,每个对象可能有不同的状态(指存储在变量中的不同的"值"),因此对象是一个具有状态、行为和标识的实体。
对象又分持久对象和主动对象,持久对象是指生存期可以超越程序的执行时间,而长期存在的且所有的操作都是被动执行的对象。在主动对象概念出现之前,人们所理解的对象概念只是被动对象,即对象的每个操作都是被动地响应从外部发来的消息才可以执行。
在开发一个具有多任务并发执行的系统时,如果仅有被动对象的概念,则很难描述系统中的多个任务。其实并发不仅仅存在操作系统中,如今多个任务并发可以说无处不在。每个任务在实现时应该成为一个可以并发执行的主动程序单位,那么如何描述呢?
如果用被动对象将无法描述那些不接收任何消息也要主动工作的对象,比如,交通灯控制系统中的信号灯,温控器中的传感器,它们的行为都是主动发起的,即主动对象至少有一个操作不需要接收消息就就能主动执行的对象。
尽管发现对象的活动是从具体事物出发分析和认识问题的,但人们在进行这种活动时实际上并不局限于对个别事物的认识,而是寻找一类事物的共同特征,将对象抽象为类。
>>> 4.2.2 类
类的概念早在柏拉图之前就出现了,面向对象编程就像柏拉图之后的西方哲学家一样延续了这种思维。类的概念与对象的概念是紧密交织在一起,因为在讨论一个对象时不得不提到它的类,但是这两个术语又存在重要的差别。对象是存在于时间和空间中的具体实体,而类仅代表一种抽象,因此可以说Validator类代表了所有校验器的共同特征。要确定这个类中的某个具体的校验器,则必须说"范围值校验器"或"奇偶校验器"。
在面向对象分析与设计的上下文中,将类定义为——类是对现实世界中事物的描述,类描述了拥有相同属性、行为和关系类别的一组对象,一个对象就是类的一个实例,因此没有共同的属性和行为的对象不能划分为一个类。比如,一个相当高层的抽象,一个GUI框架,一个数据库和整个系统在概念上都是独立的对象,因此不能将它们表示为一个单独的类。相反应该将这些抽象表示为一组类,通过这些类的实例互相协作,提供我们期望的功能。
通常将这样的一组类称为一个组件,而组件是预先创建好的程序模块,可与其它模块一起构成一个程序。通常组件以二进制形式发布,其实现对使用者来说是隐藏的。如果组件设计良好,使用者甚至不需要知道这个组件使用什么语言编写的。但组件必须至少暴露一个接口才能使用,通常组件会有暴露多个接口。从使用者的角度来看,一个组件是一些前端接口的后端服务者,程序员通过组件接口所暴露的函数操作该组件。由此可见,组件扩展了面向对象中对象作为服务提供者通过高层接口提供服务的概念。
在现实世界里,饼干也是对象,必须先有模子(类),才能做出你想要的形状的饼干,因此可以认为类是对象的模板。比如,只有符合一定条件的数值才能push到栈中,那么Validator校验器类就是由RangeValidator范围值校验器类、OddEvenValidator奇偶校验器类和PrimerValidator质数校验器类等具体校验器类的对象构成的一个集合体。属于类的任何对象都共享该类的所有属性,比如,所有的具体校验器都有这样的属性——校验参数。
在OO程序设计中,一个类就是一种抽象数据类型,用户也可以创建一个自己的类,而且可以将这个类当做数据类型使用。一旦有了类,就可以象使用普通的数据类型那样用类定义变量,如果定义了RangeValidator类,即可用它定义变量rangeValidator。RangeValidator类的变量rangeValidator可以拥有成员变量或域,代表不同校验器的属性或特性,通常将这些成员变量称为数据成员。
(1)值和属性
值是一段数据,属性描述了类的每个对象都拥有的一个值,可以这样类比——对象之于类如同值之于属性。比如,name、birthdate和weight都是Person对象的属性,color、modelYear和weight都是Car对象的属性。对于每个对象,每个属性都有一个值,比如,对象ZhangSan的属性birthdate的值是"21 October 1
对象 相关文章:
- 面向对象编程——OO思想(08-27)