高级程序设计

2 - 面向对象程序设计

2020-02-20 15:00 CST
2020-03-14 22:29 CST
CC BY-NC 4.0

什么是面向对象程序设计

  • 程序由若干对象组成,每个对象是由一些数据以及对这些数据所能实施的操作所构成的封装体;
  • 对象的特征(数据、操作)由相应的来描述;
  • 对数据的使用是通过向包含数据的对象发送消息(调用对象类的对外接口中的操作)来实现的;
  • 一个类所描述的对象特征可以从其他的类继承

面向对象程序设计的基础是数据抽象与封装。

如果没有继承,则称为基于对象的程序设计。

面向对象程序的执行过程

对象构成了OOP程序的基本计算单位,程序的执行体现为对象间的一系列消息传递

  • 从程序外部向程序中的某个对象发送第一条消息启动计算过程;
  • 该对象在处理这条消息的过程中,又向程序中的其它对象发送消息,从而引起进一步的计算。

消息处理可分为顺序/同步执行和并发执行。

面向对象程序设计带来的好处

方法的评价标准:

  • 提高软件开发效率
  • 保证软件质量

影响开发效率和质量的因素:

  • 抽象(控制复杂度)
  • 封装(保护信息)
  • 模块化(组织和管理大型程序)
  • 软件复用(缩短开发周期)
  • 可维护性(延长软件寿命)
  • 软件模型的自然度(缩小解题空间与问题空间之间的语义间隙,实现从问题到解决方案的自然过渡)

过程式程序设计的特点

  • 以功能为中心,强调过程(功能)抽象,但数据与操作分离,二者联系松散。
  • 实现了操作的封装,但数据是公开的,数据缺乏保护。
  • 按子程序划分模块,模块边界模糊。
  • 子程序往往针对某个程序而设计,使得程序难以复用。
  • 功能易变,程序维护困难。
  • 基于子程序的解题方式与问题空间缺乏对应。

面向对象程序设计的特点

  • 以数据为中心,强调数据抽象,操作依附于数据,二者联系紧密。
  • 实现了数据的封装,加强了数据的保护。
  • 按对象类划分模块,模块边界清晰。
  • 对象类往往具有通用性,再加上继承机制,使得程序容易复用。
  • 对象类相对稳定,有利于程序维护。
  • 基于对象交互的解题方式与问题空间有很好的对应。

面向对象程序设计的基本内容

对象(Object)、类(Class)

  • 对象是由数据及能对其实施的操作所构成的封装体。
  • 类描述了对象的特征,实现抽象。
  • 对象属于的范畴,是程序运行时刻的实体;类属于类型的范畴,属于编译时刻的实体。

继承(Inheritance)

  • 在定义一个新的类(子类、派生类)时,可以把已有类(父类、基类)的一些特征描述先包含进来,然后再定义新的特征。
  • 单继承:新的类只能从一个父类继承;多继承:子类可以从多个父类继承。

多态(Polymorphism)

某一论域中的一个元素存在多种解释。

  • 一名多用
    • 函数名重载
    • 操作符重载
  • 类属
    • 类属函数:一个函数能对多种类型的数据进行操作
    • 类属类:一个类可以描述多种类型的对象

绑定(Binding)

确定多态元素的某个使用是多态元素的哪一种形式。

  • 静态绑定:在编译时刻确定
  • 动态绑定:在运行时刻确定

由于继承机制,面向对象程序特有的多态:

  • 对象类型的多态:子类对象既属于子类,也属于父类
  • 对象标识的多态:父类的引用或指针可以引用或指向父类对象,也可以引用或指向子类对象(因此需要动态绑定)
  • 消息的多态:发给父类对象的消息也可以发给子类对象,父类与子类会给出不同的解释(处理)

LSP

多态带来的好处:

  • 使得程序功能扩充变得容易(上层代码不变,只要增加底层的具体实现即可)
  • 增强语言的可扩充性(操作符重载等)