每个对象都有一个接口

来源:互联网 发布:电脑网络问题在线解答 编辑:程序博客网 时间:2024/04/29 21:32
亚里士多德大概是第一个深入研究类型(Type)的哲学家,他曾提出过鱼类和鸟类(the class
of fishes and the class of birds)这样的概念。所有的对象都是唯一的,但同时也是具有相同
的特性和行为的对象所归属的类的一部分,这种思想被直接应用于第一个面向对象语言
Simula-67,它在程序中使用基本关键词 class 来引入新的类型。
Simula,就像其名字一样,是为了开发诸如经典的“银行出纳员问题(Bank teller problem)”
这样的仿真程序而创建的。在银行出纳员问题中,有出纳员、客户、账户、交易和货币单位
等许多“对象”。在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象
的类中,这就是关键词 class 的由来。创建抽象数据类型(类)是面向对象程序设计的基本
概念之一。抽象数据类型的运行方式与内置(built-in)类型几乎完全一致:你可以创建某一
类型的变量(按照面向对象的说法,程其为对象或实例),然后操作这些变量(称其为发送
消息或请求;你发送消息,对象就能够知道需要做什么)。每个类的成员(member)或元素
(element)都共享相同的性质:每个账户都有结余金额,每个出纳都可以处理存款请求等。
同时,每个成员都有其自身的状态:每个账户都有不同的结余金额,每个出纳都有自己的名
称。因此,出纳、客户、账户、交易等都可以在计算机程序中被表示成为唯一的实体(entity)。
这些实体就是对象,每一个对象都属于定义了特性和行为的某个特定的类。
所以,尽管我们在面向对象程序设计中实际所作的是创建新的数据类型,但事实上所有的面
向对象程序设计语言都使用Class关键词来表示数据类型。当你看到类型(Type)一词时,
请将其作为类(Class)来考虑,反之亦然。

既然类被描述成了具有相同特性(数据元素)和行为(功能)的对象集合,那么一个类就确
实是一个数据类型,就像所有浮点型数字具有相同的特性和行为集合一样。二者的差异在于,
程序员通过定义类来适应问题,而不再被强制只能使用现有的被设计用来表示在机器中的存
储单元的数据类型。你可以根据需求,通过添加新的数据类型来扩展编程语言。编程系统欣
然接受新的类,并且给予它们与内置类型相同的管护和类型检查(Type-checking)。
面向对象方法并不是仅局限于构件仿真程序。无论你是否同意任何程序都是你所设计的系统
的一个仿真的观念,面向对象技术确实可以将大量的问题降解为一个简单的解决方案。
一旦类被建立,你想要创建该类的多少个对象,就可以创建多少个了,然后去操作它们,就
像它们是存在于你的待解问题中的元素一样。事实上,面向对象程序设计的挑战之一,就是
在问题空间的元素和解空间的对象之间创建一对一的映射。
但是,你怎样才能获得对你有用的对象呢?必须有某种方式产生对对象的请求,使对象完成
诸如完成一笔交易、在屏幕上画图、打开开关之类的任务。每个对象都只能满足某些请求,
这些请求由对象的接口(Interface)所定义,决定接口的便是类型(Type)。以电灯泡为例来

做一个简单的比喻:

接口定义了你能够对某一特定对象发出的请求。但是,在程序中必须有满足这些请求的代码。

这些代码与隐藏的数据一起构成了实现(implementation)。从过程型编程的观点来看,这并
不太复杂。在类型中,每一个可能的请求都有一个方法与之相关联,当你向对象发送请求时,
与之相关联的方法就会被调用。此过程通常被总结为:你向某个对象发送消息(产生请求),
这个对象便知道此消息的目的,然后执行对应的程序代码。


上例中,类型/类的名称是 Light,特定的 Light 对象的名称是 lt,你可以向 Light 对象发出的
请求是:打开它、关闭它、将它调亮、将它调暗。你以这种方式创建了一个 Light 对象:定
义这个对象的“引用(reference)”(lt),然后调用 new 方法来创建该类型的新对象。为了向
对象发送消息,你需要声明对象的名称,并以圆点符号连接一个消息请求。从预定义类的用
户观点来看,这些差不多就是用对象来进行设计的全部。


前面的图是 UML(Unified Modelling Language)形式的图,每个类都用一个方框表示,类名在
方框的顶部,你所关心的任何数据成员(data member)都描述在方框的中间部分,方法(隶
属于此对象的,用来接收你发给此对象的消息的函数)在方框的底部。通常,只有类名和公
共方法(Public Method)被示于 UML 设计图中,因此,方框的中部并不绘出。如果你只对

类型感兴趣,那么方框的底部甚至也不需要被绘出。


原创粉丝点击