C++20高级编程 第五章 面向对象程序设计

第五章 面向对象设计


面向过程思想

众所周知的,C语言是一门 面向过程编程 的语言,而C++是一门 半面向对象编程(Object Oriented Programming,OOP) 的语言.

面向过程编程的语言通常将代码分割成小块,每个小块理论上完成单一的任务.如果在C程序中没有过程,所有代码都会集中于main()中.

事实上,计算机并不关心代码是位于main()中还是被分割成具有描述性名称和注释的小块.
 
经管C语言将过程表示为"函数",但是 C并非为一门真正的函数式语言 ."函数式(functional)"与"过程式(procedural)"有着很大的不同.函数式语言指类似于Lisp的语言.

面向对象思想

与基于"程序做什么"问题的面向过程方法不同,面向对象方法提出另一个问题: 对哪些对象进行建模?

OOP的基本观念是不应该将程序分割为若干任务,而是将其分为 自然对象的模型.

类(class) 将对象与其定义区分开来, 对象(object) 是类的一个 实例(instance).它拥有一些特征,从而与同一类型的其他事物区分开来.

组件

考虑一个复杂实际对象,会发现其由许多 组件(component) 所组成.对于OOP来说,将对象分解为更小的组件是一种必备能力,就像将复杂任务分解为较小过程是过程式编程的基础一样.

本质上,组件与类类似,但是组件更小、更具体

属性

属性(attribute) 将一个对象与其他对象区分开来.所有的对象都具有相同的属性,但是属性的值不同.属性用来描述对象的特征.

行为

行为 回答两个问题: "对象做什么""能对对象做什么".
在面向对象编程中,许多功能性的代码从过程转移到类.通过建立具有某些行为的对象并定义对象的交互方式,OOP以更丰富的机制将代码和代码操作的数据联系起来. 类的行为由类方法实现.

类之间的关系

"有一个"关系

在此类关系中,可认为某个类是另一个类的一部分.组件通常代表"有一个关系",因为组件表示组成其他类的类.
"有一个"关系有如下两种类型:

  • 聚合:当聚合器被销毁时,聚合对象(组件)可以继续存在.例如:假设动物园包含一组动物对象,当动物园破产时动物对象不会被销毁,他们被转移到另一个动物园. 失M(money)棍哥

  • 组合:对于组合,如果由其他对象组成的对象被销毁,那么这些其他对象也会被销毁.

"是一个"关系

"是一个"关系是面向对象编程中非常基本的概念,因此有许多名称,包括 派生(deriving),子类(subclass),扩展(extending)和继承(inheriting).

类模拟了现实世界包含具有属性和行为的对象这一事实,继承模拟了这些对象通常以层次方式来组织这一事实.

  • 继承技术  
    当生成子类时,程序员有多种方法将某个类与其父类区分开.可使用多种方法生成子类.
        - 添加功能:增加新的方法
        - 替换功能:采用虚方法机制
        - 添加属性:增加新的属性
        - 替换属性:属性的重定义
  • 多态性

多态性(polymorphism) 指遵循一套标准属性和方法的对象可互换使用.类定义就像对象与之交互代码之间的契约.

"not-a"关系

当考虑类之间的关系时,应该考虑类之间 是否真的存在关系 .不要把面向对象设计的热情全部转换为许多不必要的类/子类关系

混入类

混入(mixin)类代表了类之间的另一种关系.在C++中,混入类的语法类似于多重继承,但语义完全不同.
使用混入类,可向类中添加功能,而不需要保证是完全的"是一个"关系.可将它当做一种分享(share-with)关系.

UML

统一建模语言(Unified Modeling Language,UML) 是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言.UML是面向对象设计的建模工具,独立于任何具体程序设计语言.

  • UML的图形:  
        - 用例图:从用户角度描述系统功能  
        - 类图:描述系统中类的静态结构  
        - 对象图:系统中的多个对象在某一时刻的状态。
        - 状态图:是描述状态到状态控制流,常用于动态特性建模
        - 活动图:描述了业务实现用例的工作流程
        - 顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互
        - 协作图:描述对象之间的协助关系
        - 构件图:一种特殊的UML图来描述系统的静态实现视图
        - 部署图:定义系统中软硬件的物理体系结构
        - 包图:对构成系统的模型元素进行分组整理的图
        - 组合结构图:表示类或者构建内部结构的图
        - 交互概览图:用活动图来表示多个交互之间的控制关系的图

类图

类的基本表示法,包括了 名称,属性,方法:

  • 属性定义的格式:[可视性]属性名[:属性类型],其中[]内为可选内容
  • 方法定义的格式:[可视性]操作名[(参数列表)][:返回类型][{特性}]
  • 方法表示的意义:
        - -表示private
        - #表示protected
        - ~表示default,也就是包权限
        - _下划线表示static
        - 斜体表示abstract

alt 类图

类关系

在UML类图中,常见的有以下几种关系: 关联(Association),继承(Inheritance),依赖(Dependency),聚合(Aggregation),组合(Composition),实现(Realization).  
并且这些关系中有时之间是有关联的,存在关系之间的强弱.

alt 类关系

  • 关联:是一种拥有的关系,它使一个类知道另一个类的属性和方法,在C++中通过friend声明友元实现.
  • 继承:即继承关系,在C++中通过其内置的继承关系语法来实现.
  • 依赖:两个相对独立的对象,一个对象负责构造另一个对象的实例.
  • 聚合:是整体与部分的关系,且部分可以离开整体而单独存在.
  • 组合:是一种强的拥有关系,体现了严格的部分和整体关系.
  • 实现:表示一个class类实现interface接口的功能.

alt 类图示例

posted @ 2023-11-29 13:24  Mesonoxian  阅读(32)  评论(0编辑  收藏  举报