第四部分
面向对象的编程( OOP)和
面向对象的编程语言( OOPL)
2
参考书:
3,邵维忠,廖钢城,苏渭珍 (译 ),面向对象的设计, 北
京, 北京大学出版社,1994年 11月 (第七章)
6,蔡希尧,陈平, 面向对象技术, 西安, 西安电子科技
大学出版社,1993年 11月 (第 3章)
2.冯玉林,黄涛,倪彬, 对象技术导论, 北京, 科学出版
社,1998年 3月 (第四章)
3
主要内容:
程序设计范型
不同的程序设计范型
面向对象的程序设计范型主要特点
面向对象的编程语言
基本特点、历史、类别
语言、类库及编程环境的结合
为实现 OOD模型,如何选择编程语言
从哪些方面评价编程语言?
简单介绍几种典型的 OOPL
C++—— Visual C++
Object Pascal—— Delphi
Smalltalk
Objective-C
Eiffel
Java
4
一、程序设计范型( programming paradigm)
关于计算机系统的思考方法。它体现了一类语言的主要特
点。(蔡希尧)
人们在程序设计时所采用的基本方式模型。( Tello,E,R)
面向过程的程序设计范型:
中心思想 —— 程序设计主要是过程设计
决定所需的过程,设计过程的算法
关键:过程调用
语言提供向过程传送变元和返回值的设施
模块化程序设计范型:
基本思想 —— 信息隐蔽,需求与求解方法分离,相关
的数据结构与算法结合在一个模块中,与其它模块隔
离,使其它模块不能随便访问 —— 有了封装的思想
例如,Modula-2
其它程序设计范型:
结构化程序设计,函数式程序设计,逻辑程序设计等
5
面向对象是一种新的程序设计范型
是在上述范型基础上发展起来的
增加了 类 和 继承,用类创建 对象 实例
思想方法
从客观存在的事物出发构造软件系统
运用人类日常思维方式
主要特点
使用对象、类、继承、封装,聚合、关联,消息
,多态性 等基本概念来进行程序设计。
从模块化到抽象数据类型( ADT)
模块内实现细节局部化;
模块类型化;
为模块类型设置足够的操作集,形成 ADT;
6
二、面向对象的编程语言( OOPL)
1、基本特性:
语言元素能够支持 ——
类的定义
对象的静态声明或动态创建
属性和操作的定义
继承、聚合、关联和消息的表示
语言机制 ——
类机制
封装机制
继承机制
高级特性:
多态、多继承的表示和支持机制
7
2、发展历史及语言谱系
Algol
Simula
Smalltalk
LISP
Flavors
LOOPS
CLOS
Eiffel
Actor
C++
C
Objective-C
Pascal
Ada
Modula-
2
Java
1960
1970
1980
1990
Object
Pascal
Visual C++ Delphi
8
3、类别
纯面向对象语言
例如,Smalltalk,Eiffel
较全面地支持 OO概念
强调严格的封装
混合型面向对象语言
例如,C++,Objective-C,Object Pascal
在一种非 OO语言基础上扩充 OO成分
对封装采取灵活策略
结合人工智能的面向对象语言
例如,Flavors,LOOPS,CLOS
9
4、语言 +类库 +编程环境
编程语言 对编程形成更强有力的支持
类库 提供各种常用的类,如:定义共同协议的一般类
定义基本数据结构的类
界面对象类
编程环境
工具 工具 工具 工具
提供方便易用的人机界面
和各种常用工具,如:
编辑工具、可视化编程工
具、调试工具、浏览器等
10
1、一般原则
* 基本原则 —— 语言的选择完全从实际出发
主要考虑成本、进度、效率等实际因素
* OOPL是实现 OOD的理想语言
它使源程序能很好的对应 OOD模型。
* 带有类库、编程环境、权限管理的 OOPL更好。
*用非 OO语言也能实现 OOD模型
缺乏 OO机制的保证和支持,
但若自觉遵循一定的原则,可以保持某些 OO风格。
三、为实现 OOD模型选择编程语言
在 OOD完成之后,选择什么编程语言实现 OOD模型?
11
着眼点:
语言捕捉问题域语义的能力,
即对 OO概念的表达能力
对 OOD模型的实现能力
目标:
一致性:分析、设计和编程
各个阶段都能采用一致的基本表示
概念、术语、风格都一致,形成良好的映射
可复用性:
可维护性:
12
2、编程语言的评价标准
( 1)能否描述类和对象
是否提供封装机制?
对封装有无可见性控制?
( 2)能否实现一般 -特殊结构
支持多继承、单继承还是不支持继承?
支持多继承时,是否能解决命名冲突?
是否支持多态?
职员
专业
??
??
在职学员
学员
专业
??
??







职员类的“专业”
是该职员从事的专
业;
学员类的“专业”
是该学员学习的专
业。
问题:
“在职学员”类同
时继承了两个“专
业”属性,引用时
无法判断指的是哪
一个。
13
( 3)如何实现整体 -部分结构
用什么实现?如何表示多重性?
( 4)如何实现属性和服务
用什么表示属性? 用什么描述服务?
有无可见性控制?
能否描述约束?
是否支持动态绑定 (dynamic binding)?
( 5)如何实现实例连接和消息连接
用什么实现实例连接?如何表示多重性?
如何实现消息连接?
( 6)其它可考虑的因素(反映于具体的语言版本)
是否带有可视化编程环境
是否带有类库
能否支持对象的永久存储
14
四、几种典型的面向对象的编程语言简介
C++—— Visual C++
Object Pascal—— Delphi
Smalltalk
Objective-C
Eiffel
Java
重点,C++,Smalltalk,Eiffel
15
1,C++
由 AT&T的 Bell试验室开发,1988年推出产品
是在 C语言的基础上扩充 OO特征而得到的
是 C语言的超集
是一种混合型的 OOPL
保持 C语言的高效率、可移植,与 C兼容
使广大程序员容易接受
采用强类型机制
支持动态绑定
是目前使用最广的 OOPL
16
封装机制:有
可见性控制,private,protected,public,friend
对象的创建和删除:
提供构造函数( constructor) —— 类名()
和析构函数( destructor) —— ~类名()
静态对象(从程序开始执行到退出)
创建:类名 对象名
删除:程序退出时
动态对象(显式地创建和删除)
创建,对象指针 = new类名(参数)
删除,delete 对象指针
( 1)类和对象
类 ? class 对象 ? object
17
( 2)一般 -特殊结构
基类 -派生类( base-derived class)
支持单继承和多继承
不解决命名冲突
支持多态
在继承的同时可定义被继承内容的可见性
( 3)整体 -部分结构
嵌套对象 (nested object) 或
嵌入指针 (embedded pointer)
18
( 4)属性、服务
属性 ?成员变量
可见性,private,protected,public,friend
类中的变量可说明为静态的 (共享 )
服务 ?成员函数
构造函数:与类名相同,可以有多个
析构函数:~类名
可见性:同属性
没有显式的约束
动态绑定:声明为 visual的函数是动态绑定的,
在基类中定义的 visual的函数,可以在派生类中改写
( 5) 实例连接和消息连接
用指针实现实例连接
多重实例连接可以用指针数组
消息连接:用函数调用实现,采用强类型的参数
19
术语对照
OOA和 OOD
对象 object
类 class
属性 attribute
服务 service
一般 /特殊
generalization/specialization
整体 /部分 whole/part
消息连接 message connection
实例连接 instance connection
C++
对象 object
类 class
成员变量 member variable
成员函数 member function
基类 /派生类
base class/derived class
嵌套对象 nested object
嵌入指针 embedded pointer
函数调用 function call
对象指针 object pointer
20
是由 Xerox公司 PARC研究中心在 Alan Kay的研究工作基础上
开发的,先后发布了 Smalltalk-72,76,78,80等版本。
Smalltalk-72其中正式使用了, 面向对象, 的术语
Smalltalk-80成为完善的面向对象语言
Smalltalk语言是最早的、最有代表性的 OOPL之一
迄今为止大部分 OO基本概念 Smalltalk都已具备
是一种纯 OO的语言
除对象之外,没有其它形式的数据
全部属性都是严格封装的,全部方法对外可见
是一种弱类型的语言
不声明变量类型,不作类型检查
伪编译,生成虚拟机代码,然后解释执行
支持动态绑定
3,Smalltalk
21
Smalltalk- 80不仅是一个编程语言, 而且带有:
类库
类库中的类不仅支持用户的编程
语言的编译, 排错, 编辑等程序的实现
也基于该类库
多窗口的图形用户界面 和 一组编程工具
—— 形成集成化, 交互式的编程环境
用户可以在浏览器上通过填写类的摸板来定义类,
并在相关的窗口中定义它的方法和消息
22
( 1)类和对象
类 ? class 对象 ? instance
封装机制:有
类的定义:用 Smalltalk浏览器填写,供填写的类定义模板格式如
下,
Class name 类名
Superclass 指出父类是谁 (最上层是 object)
Instance variables 实例变量
Class variables 类变量 (大写开头 )
Instance methods 实例方法
Class methods 类方法
对象的创建:
对象名,=类名 new
( 2)一般 -特殊 ? 超类 -子类
特殊类的定义:只要在模板的 superclass一栏中填写超类名
单继承
以 Object为最上层的类 (根 )
23
( 3)整体 -部分 ? 嵌套对象
利用 Smalltalk库中的集合 (collection)类,
可使一个整体对象中包括多个部分对象
( 4)属性、服务
属性 ? 实例变量
可见性:本类
没有显式约束
服务 ? 方法
可见性:都可见
没有显式约束
支持动态绑定
( 5)实例连接和消息连接
实例连接 ?用对象标识聚集实现
消息连接 ?消息 (通过协议 )
24
术语对照
OOA和 OOD
对象 object
类 class
属性 attribute
服务 service
一般 /特殊
generalization/specialization
整体 /部分 whole/part
消息连接 message connection
实例连接 instance connection
Smalltalk
对象 object (一般讨论 )
实例 instance(编程语言 )
类 class
实例变量 instance variable
方法 method
超类 /子类
superclass/subclass
嵌套对象 nested object
消息 message
对象标识集合
object identifier collection
25
5,Eiffel
是由 B,Meyer等人于 1985年在美国交互软件工程
公司 ( ISE) 开发的
是一种纯 OO的语言
全面地支持 OO概念
支持多继承 ( 是 OOPL中较早的 )
解决命名冲突
强类型
全面地静态类型化
支持参数化类型(类属)
支持断言和不变式
带有编程环境和大量的开发工具
是一种较成熟的 OOPL
在语言设计上很受称赞
80年代后期已成功的应用于工业界和军界
26
( 1)类和对象
类 ? class 对象 ? object
类的定义:
class 类名 export
移出特征表 —— 列出允许外部访问的变量及例程名
inherit
父类名
rename 特征名 as 新特征 名,??
—— 列出重新命名的变量及例程名
redefine 特征名,?? ;
—— 列出要在本类重新定义的变量及例程名
父类名 ??
feature
变量名:类型;
??
例程名(参数表) is
do
语句
end
??
end
27
( 2)一般 -特殊 ? 祖先-子孙
支持多继承,用 inherit列出所有父类
实现多态性,允许特征重定义(用 redefine)
通过重命名解决命名冲突(用 rename)
( 3)整体 -部分
嵌套对象或嵌入指针
28
( 4)属性、服务
属性 ? 变量
可见性:由移出表控制
移出 —— 外部可见
不移出 —— 本类可见
服务 ? 例程 (routine)
可见性,由移出表控制
约束:通过断言表示服务约束
先决条件( require)
后续条件( ensure)
循环不变式( invariant)
支持动态服务
( 5) 实例连接和消息连接
实例连接 ?嵌入对象指针 (集合 )
消息连接 ?例程调用
29
术语对照
OOA和 OOD
对象 object
类 class
属性 attribute
服务 service
一般 /特殊
generalization/specialization
整体 /部分 whole/part
消息连接 message connection
实例连接 instance connection
Eiffel
对象 object
类 class
变量 variable
例程 routine
祖先 /子孙
ancestor/descendant
嵌套对象 nested object
例程调用 routine call
嵌入对象指针
nested object pointer
30
1、基于对象的语言 —— Ada
Ada是面向程序包的语言
有把变量和过程打包的结构
但不是 OOPL,主要因为不支持继承
( 1)类,对象 ?无
但可以把变量和过程打包,在形式上描述类和对象
( 2)一般 -特殊 ?无
Ada不支持继承
( 3)整体 -部分 ?集合或指针
五、用 非 OO编程语言实现 OOD模型
31
( 4)属性与服务
属性 ?变量
以“私有”、“有限私有” (limited private)控制可
见性
支持显式的约束
服务 ?过程,函数
参量的类型可以是参数化的 (类属 )
例如,x,ArgType
其中 x是参量,ArgType是未定的类型,调用时指定。
这使过程、函数可适应多种类型的参量。
程序包说明部分声明的过程函数外部可见
实体部分声明的为私有
支持异步执行的任务( 5)消息连接和实例连接
实例连接 ?类型指针
消息连接 ?过程 /函数调用
32
2、过程语言 —— 以 C为例
( 1)类,对象 ?无
可以用结构定义对象,可通过指针说明应该有哪些函
数 (不封装 )
( 2)一般 -特殊 ?无
可把一般结构嵌入特殊结构
( 3)整体 -部分 ?指针、嵌套的结构
( 4)属性与服务 ?变量、函数
( 5)实例连接 ? 指针;消息连接 ? 函数调用