什么是对象?什么是面向对象?对于已经学了这么久C++的我来说,再提出这个问题自己都觉得有点不可思议。然而,我发现我的确没法准确的说出这个答案。当类、继承、多态这些概念深入思想当中的时候,我已经把它们当作面向对象的代名词。回过头来面对对什么是对象,什么是面向对象时,我才想到我从来没有理解过什么是面向对象。
来自《面向对象软件开发教程》(Scott W.Ambler)的解释:
对象:可以是一个人、一个地方、一件物品、一个视图、或者一个报表。对象知道一些东西(也就是说它们有数据),他们可以完成一些事情(也就是说它们有功能)
面向对象范型(object-oriented paradigm):一种基于"从被称为对象的可重用组件来构建系统"概念的开发策略。
在这本书中,将object-oriented paradigm和strucurted paradigm
被一些人称为面向对象之父的Alan Kay这样定义面向对象编程:
- 任何事物都是一个对象
- 通过互相联系的对象请求其他对象执行一定行为来完成计算。对象之间通过发送和接收消息进行通信。消息是指对指定行为的请求,并伴随着完成这项任务所需的参数。
- 每个对象有自己的存储空间,用来存储其他对象
- 每个对象是一个类实例。类用来代表一组相似的对象,例如整数、链表等。
- 类可以看作是存储仓库,用来保存与一个对象相关的行为。也就是说,同一个类的多个实例能够执行相同的行为。
- 类可以组织成一个单根树状结构,称为继承层次。在这个树状结构中,一个类实例的存储空间和行为自动地被其派生类使用。
《面向对象分析与设计》(Grandy Booch)中提到,对象是一个朴素的概念,约一岁以后,人会培养出一种对象概念的能力。从人类的认知角度来说,对象应是以下之一
- 可触摸或可见的东西
- 可被理性理解的东西
- 可进行想像或施加动作的东西
接下来还提到,现实生活中的对象不是软件开发中唯一感兴趣的对象,另一些重要的对象是设计过程的产物。最后的总结是:对象具有状态、行为、和标识。相似对象的结构和行为在它们共同的类里定义。术语"实例"和"对象"是可以互换的。
《面向对象编程导论》(Ian Graham)中对面向对象有这样描述:
一些作者已经强调了面向对象程序设计和面向数值程序设计的区别。MacLenna(1982)指出,值(例如数字17)是应用式的和只读的,他们总是抽象的。对象(例如实例)在一定范围内存在,可以被创造、撤销、共享和更新。数值是引用透明的,引用它的一切事情将使用同样的数值。Smalltalk也因此受到一些批评,在Smalltalk中任何事物都是对象。无法实现一种正确的区分将导致几个危险。不清楚共享的数据结构是否可能被错误地更新,或者存在着一个以潜在的代价昂贵的复制开销。在给出了应用式程序设计或面向数值的程序设计的一切优点以后,为什么我们应该完全需要对象呢?
首先,如果我们所采用的数据结构对应于真实世界的话,那么计算机系统里现实世界模拟将会被大大简化。文件是对象,他们不能被代数描述。在普通程序设计语言中,变量是对象,他们的标识和区分是通过他们的位置,而无需考虑它们的当前值是什么。一个值属于一个类型,而一个对象属于一个类,本质的区别是:具有相同描述的两个对象可能并不相同,而相同的描述不可能是两个不同的值。例如,只可能有一个值等于17的整数,但蒙娜丽莎画像可以有两个完全一样的副本。反之则是不正确的,这可以通过下面的情况进行说明。考虑具有不同描述的两个对象(早晨的星星和晚上的星星),他们代表的是同一物理对象(金星)。许多语言都混淆了这个问题,例如,Pascal中的文件可能无法被赋予表达式或在表达式中使用,尽管他们的声明是通过和其他类型同样的方式。模拟系统的程序员必须处理“状态”和状态的变化,他们必须处理时间或(至少在人工智能里的)可能世界。应用式程序设计不是为此目的而设计的,而是为了处理不受时间影响的数学抽象。
那么,我们所需要做的就是清楚地区分值和对象以及支持这种区分并允许使用恰当模型(值或对象)的一种语言。