一、什么是对象及面向对象
1.哲学中的对象
a) 客体(对象)object可感知或可想象到的任何事物。客体既包括客观存在并可观察到的事物,也包括想象的事物。
b) 主体subject是指对客体有认识和实践能力的人。
c) 客体是相对于主体而言的。处于客体的事物,当作为某一具体事物本身的时候,就成了主体,其他与之处于关系的物,就变成了客体。处于主体的事物,作为其他事物的关系面出现的时候,就成了客体。
2.对象与结构
a) 对象是一种结构
i. 整体性
ii. 转换性
iii. 自身调节性
3.对象的特征
a) 内涵是指一个概念所概括的思维对象本质特有的属性的总和。
b) 外延是指一个概念所概括的思维对象的数量或范围。
4.什么是对象?
a) 哲学概念,对象(客体,Object)指可感知或可想象到的任何事物,既包括客观存在并可观察到的事物,也包括想象的事物。
b) 对象(object),是面向对象(Object Oriented)中的术语,既表示客观世界问题空间中的某个具体的事物,又表示软件系统解空间中的基本元素。
c) 在软件系统中,对象具有唯一的标示符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)是实例(Instance)。
5.面向对象的方法学
a) 封装
b) 信息隐藏
c) 消息传递
d) 动态连接
e) 实例化
f) 泛华与多态
g) 关联与聚合
6.面向对象与基于对象
a) 面向对象,可以允许用户使用以上全部的原则。
b) 基于对象,允许用户使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让用户派生新对象类型。用户只能使用现有对象的方法和属性。(Java Script,OCL)
二、封装与数据隐藏
1.封装
a) 封装是指将对象的全部的属性和全部的操作结合在一起,形成不可分割的独立单位,即对象。
b) 使对象能够集中而完整地描述并对应一个具体事物。
c) 体现了事物的独立性。
d) 减少内部修改对外部影响
e) 编程麻烦\执行效率的损失
2.信息隐藏
a) 信息隐藏是指对象与外界的交互中,尽可能地隐藏对象的内部细节,仅保留有限的对外接口与外部进行联系,而具体的实现细节对外是不可见的。
b) 信息隐藏既可以隐藏属性,也可以隐藏操作。
c) 一个对象信息隐藏的内容可随与之交互的对象的不同而改变。
d) 公开静态的、不变的服务,而把动态的、易变的服务隐藏起来。
e) C++使用关键字public、private、protected、friend对类的属性与操作进行信息隐藏。
三、实例化
1.实例化
a) 可以以类为模板产生属于该类的对象,这种根据对象的过程称为实例化。
b) 实例化使并发成为可能。
c) C++中通过构造函数与析构函数支持实例化机制,保证在程序运行中产生或销毁对象(实例)。
2.实例化的意义
a) 符合自然的思维方式
b) 使得并发处理成为可能
3.抽象数据类型(Abstract Data Type简称ADT)
a) 遵守封装、信息隐藏与实例化的数据类型称为抽象数据类型。确切地说,抽象数据类型机制必须具有如下的性质:
i. 允许程序员自己定义类型扩展编程语言。
ii. 该类型既包括数据的定义,又包括操作的定义,二者不可分割。在该类型内部,任意操作可以访问该类型的数据或调用该类型的其他操作。而从该类型外部并不能直接访问该类型所定义的数据与操作。
iii. 该类型区分公共接口与私有实现,在公有接口中向外提供一些数据与操作的访问,在私有实现中提供一些公有接口调用和访问的底层支持数据与操作。
iv. 可以产生程序员定义的类型的(无限)实例。
b) 抽象数据类型是从面向过程编程方法到面向对象编程方法过渡的中间状态,Ada和CLU
c) 抽象数据类型已经具备了面向对象方法中类的最基本的特征,并成为面向对象方法的雏形。
4.消息传递
a) 只能通过向对方发送消息的方式传递消息,这就是消息传递机制。
b) 对象只能借助消息传递机制才能同其他对象通信。
c) 每个消息必须发送给指定的接受者,并且消息的解释依赖于接受者。
d) 消息传递是一种强大的机制,提供了函数名重载、多态和软件复用能力。
5.为什么消息会引起一定的延迟?
a) 解释1:消息传递需要时间?
b) 解释2:每个消息必须发送给指定的接受者,并且消息的解释依赖于接受者?
c) 解释3:虚方法需要查虚表,非虚方法是否有想同的问题?
6.消息的编译原理(C++)
类C的方法m被翻译成函数fm
|
方 法 |
函 数 |
原型 |
返回类型m(形参表) |
返回类型fm(C &this,形参表) |
调用 |
m (实参表) o.n (实参表) |
fm (this,实参表) fn (o,实参表) |
属性访问 |
k o.k |
this.k o.k |
7.消息传递的作用
a) 是对现实世界的模拟,符合人们自然思维方式
b) 是软件复用的重要手段
五、泛化与多态
1.泛化
a) 泛化是面向对象方法中的一个重要概念,能够在很大程度上提高软件开发效率。也称继承、一般-特殊结构。
b) 泛化关系是一种类之间的关系。可将一类对象进一步细分为许多子类,原来的类(父类)与子类之间的关系就是泛化关系。父类称为子类的泛化,子类称为父类的特化。
2.多态
a) 多态(Polymorphism)一词出自希腊语polumorphos,意为具有多种形式或形态的情形。
b) 在面向对象方法中,多态主要是指在泛化关系中的各个类中名字相同的属性和操作具有不同的意义。
c) 而多态则是为了实现另一个目的——接口复用,节省大量的编码工作量。
3.覆盖(override)与重载(overload)
a) 覆盖,如果子类中的成员函数f(x)具有父类成员函数f(x)相同的基调,那么称子类的f(x)进行了覆盖。
b) 重载,是指允许存在多个同名函数,但这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同),即具有不同的基调(signature)。
c) 覆盖导致多态,由动态链接实现。
d) 重载与多态无关,由静态链接实现。
4.基调(signature)与原型(prototype)
a) 函数原型
i. 类似函数定义时的函数头,为了能使函数在定义之前就能被调用,C++规定可以先说明函数原型,然后就可以调用函数。函数定义可放在程序后面。
ii. 函数原型由函数返回类型、函数名和参数表组成,它与函数定义的返回类型、函数名和参数表必须一致。函数原型不必包含参数名字,可只包含参数的类型。
iii. 例如:int area(int,int);等价于int area(int a,int b);
b) 函数基调(signature,签名,特征标记)
i. 函数签名包含了一个函数的信息,包括函数名、参数类型、函数所在类和命名空间及其他信息。具体的函数签名方法视不同的编译器而定,一般不包括函数的返回类型。
ii. int f();
iii. float f();
iv. 不能出现在同一个类中
c) 函数调用与函数基调有关
5.动态链接
a) 在运行时才能知道消息的特定接受者及其影响的方法。
b) 编译期间不知连接具体的函数地址,运行时链接相关函数地址。
c) 动态链接会影响程序的效率。
d) 纯面向对象语言所有的函数都以动态链接方式运行。
e) C++中可以执行哪些函数是虚成员函数
六、关联与聚合
1.关联
a) 同现实世界一样,面向对象方法中的各个对象并不是孤立存在的,它们之间存在各种具有特定含义的关系。这种关系成为(关联)链。
b) 关联是对象间链的集合。
2.聚合
a) 用来描述对象之间的整体-部分关系
b) 整体-部分关系有很多种类
3.关联与消息
关联与消息传递是两个不同的概念
a) 一种观点:
i. 关联的目的是为了提供服务,必然导致信息传递
ii. 只有两个类之间存在关联,才能互发消息
b) 另一种观点:
i. 两个对象之间有关联链,并不一定具有消息传递关系
ii. 两个对象之间传递消息,并不一定有关联链