当前课程知识点:面向对象程序设计(C++) >  第五讲 找到对象,确定接口 >  5.1 从FOP到OOP >  Video

返回《面向对象程序设计(C++)》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《面向对象程序设计(C++)》慕课在线视频列表

Video课程教案、知识点、字幕

我们前面已经讲了很多有关

对象和类的一些语法

现在我们就开始利用这些

面向对象的类呀语法

还有什么继承虚函数什么这些语法

真的把我们的这个程序设计

从以前的这种面向过程的做法

逐渐向面向对象的做法去转换

转变

而要做到这一点呢

我们的第一步就是要

试图去怎么样找到这个对象

对象到底是什么玩意

我们在设计的时候

到底怎么样去找到

哪些东西应该是对象的组成部分

那我们就从一个简单的例子开始

这个例子是什么呢

我们都见过

这个电子计价器

就是当我们去买东西的时候

称了重量

它自动的就给你

产生出商品的这个准价格

那么这种电子计价器

它输入也很简单

无非就是几样商品的单价

然后商品称重的重量

最后输出一个总价

那我们怎么样去用面向对象的思想

去实现一个电子计价器呢

首先我们先看看我们传统的做法

这个FOP的这种面向过程的这种

电子计价器是什么样子

我们看这段程序

这段程序里边首先是

就是一个main函数

首先我们定义了几个float变量

分别用来表示这个

苹果和香蕉的价格

苹果和香蕉的重量

还有一个是

用来存我们最后的结果

然后我们要求

输入了苹果的重量和香蕉的重量

接下来计算这个总价

最后输出结结果

看起来很简单的一个过程

但是我们从这里面

就可以去分析

一个对象应该是怎么去创建

怎么去产生的

我们仔细去看这个秤

这个秤它本身要输入两类东西

两类数据

一类是每一种水果的重量

还有一类是每种水果的单价

那么我们看这两种数据

重量这个东西

因为你每次称的东西

它肯定不一样多呀

那么这个重量这个数据

肯定是经常变的

而相对于这个每次

都要变化这个重量

那单价

就是一个相对不变的东西了

那么这种每次都要变的数据

和相对不变的数据

就是单价

它实际上是两个不同层次的东西

它在两个不同层次上

那么我们就应该把这两个

不同层次的要变化的数据

给它区分开

在我们的程序里表现出来

它是两个不同程序的东西

那怎么办呢

其实我们也都见着过

我们在使用电子计价器的时候

我们都是先把单价输进去

然后我们再去称这个东西

每次称这个东西

我们选择一下这是什么

它自然就把单价用上了

换句话说我们单价这个东西

不是每次都输入的

而是封在这个计价器里边的

它是占计价器的一部分

那么从我们的程序设计里面

怎么能达到这个目的呢

我们看这段OOP版的

面向对象版的这种电子计价器

其实我们一看就发现了

我们在OOP版的电子计价器里边

我们这个calculator

这个类

它本身就有了两个

分别叫appleprice和bananaprice的

这么两个成员变量

这两个成员变量

它实际上就可以作为calculator

这个电子计价器的一部分

被封装在这个电子计价器里边了

然后它有一个caltotal

这么一个caltotal这么一个接口

这么一个成员函数

这个成员函数有两个参数

分别是appleweight和bananaweight

就是苹果的重量和香蕉的重量

因为这两个东西是每次都变的

所以它们被作为

成员函数的参数设置在

出现在calculator里边了

而相对不变的苹果的价格

香蕉的价格则作为电子计价器的

成员的变量放在里面了

实际上这就是封装

当我们封装完了这个calculator之后

这个电子计价器我们要使用它的时候

就相对容易的多了

我们先用这个

先产生一个电子计价器的一个实例

看我们这个程序里边先产生一个实例

这个实例里边

就把苹果的价格和香蕉的价格

都给它预先设好了

然后在程序里面去调用这个

用这个苹果重量和香蕉重量作为参数

去调用它的成员函数caltotal

来获得它的总价

从这个程序我们可以看到

什么是封装

其实如果你是卖家

那么你想怎么样用着方便

肯定是把这些

怎么说呢

这些价格都预先

预制到这个计价器里面

那肯定是最方便的

而经常变化那个重量

是每次都要输入的

作为一个参数来使用

那么calculator

或者说这个电子计价器这个概念

本身它就应该包含有这个价格

换句话说价格

是要封装在

这个calculator这个对象里边的

而相应的我们对于买家来讲

当然了我这里不讨论

什么讨价还价这类问题

对于买家来讲

如果只是一个买东西

那么它不涉及到

这东西单价是什么

它只要说我买的这些苹果

买了这些香蕉

我应该付多少钱就OK了

它并不需要去管

我这个钱是怎么算出来的

单价是多少

那么对于他来讲

他有意义的是

我这个caltotal这个函数

这个成员函数

而这个成员函数

恰好是我这个类报出来这部分

是给大家看到的这部分

它是类所提供

给外界使用的这个功能

我们一般来讲就把它称为是接口

它是类提供出来的接口

而相应与这个接口其他的部分

那些实现的部分

则被类用封装的方式

精心的隐藏了起来

这实际上就是我们类

的一个很重要的一个用处

我们看这段程序里面

我们可以看到

我用这个红框标出来的这块

这个caltotal

实际上它就是我们刚才说的

那个接口的概念

而稍微遮住了一点的那个

float那两个price则是我们

要隐藏起来的那些实现细节

接下来再介绍一个非常实用的玩意

叫UML类图

这个实际上是在我们

软件工程里边经常要使用到

不光软件工程

我们有很多时候进行讨论的时候

都会用到这个东西

类图实际上就是用来描述一个类

或者是一个类的一些类

它们的这个组成关系的这么一个图

这个类图

我们看图里边

看到了这是一个类的类图

它分这么几部分

一个方框代表着是一个类

方框最顶那一层标题是它的类名

下面有几个是被隐藏的

中间那一排

那个是被隐藏的实现细节

一般来讲这里面多数是一些

00 :09 :30英

的这种定义

这种类的成员变量定义

或者说类的成员函数的定义

而下面这个

最下面那一行

那里面是这种

被暴露出来的这种接口

这种类图我们后面也会经常看到

也是我们非常常用的一种手段

前面我们介绍了这么一个简单的例子

我记得咱们前面说过

这个世界是永远在变化的

那么我们对这个

电子计价器这个东西

它也会不断变化

我们对它的认识也会不断的变化

那么如果我们希望这个计价器

它具有更多的功能

或者说这个计价器

给它加入更多的元素

那我们应该怎么去设计

这个计价器让它更合理呢

比如说我可能说

现在这个计价器

苹果和香蕉必须都买

那么只买一样行不行

我以后不光卖苹果香蕉

我还要卖梨怎么办呢

现在这个计价器怎么说呢

这个价格的设置是随便设的

那我以后对这个价格进行一些管制

比如说我设定个上限怎么办

还有更过分一点的

以它为基础

我搞一个网上水果店

搞集中配送可不可以啊

那么怎么去实现这些东西呢

我们可以自己去思考一下

面向对象程序设计(C++)课程列表:

第一讲 课程简介与编程环境

-1.0 课程定位、教学内容

--课程定位与教学内容

-1.0 课程定位、教学内容--作业

-1.1 编程环境与工具

--程序结构与编译链接

--源程序拆分

--多文件编译链接的方法

-1.2 main函数的命令行参数

--main函数的命令行参数

-作业一--作业

第二讲 基础语法(1)

-2.1 变量定义

--变量定义

-2.2 变量的初始化、类型推导与基于范围的循环

--变量的初始化、类型推导与基于范围的循环

-2.3 函数重载

--函数重载

-2.4 函数参数的缺省值与追踪返回类型的函数

--函数参数的缺省值与追踪返回类型的函数

-2.5 类的定义

--类的定义

-2.6 类成员的访问权限与友元

--类成员的访问权限与友元

-第二讲 基础语法(1)--作业二

第三讲 基础语法(2)

-3.1 构造函数析构函数

--构造函数析构函数

-3.2 赋值运算符重载

--赋值运算符重载

-3.3 流运算符重载

--流运算符重载

-3.4 函数运算符重载

--函数运算符重载

-3.5 下标运算符与自增减运算符重载

--下标运算符与自增减运算符重载

-3.6 静态成员与常量成员

--静态成员与常量成员

-3.7 对象组合

--对象组合

-3.8 移动构造函数

--Video

--Video

-3.9 default修饰符

--Video

-第三讲 基础语法(2)--作业三

第四讲 基础语法(3)

-4.1 继承

--Video

-4.2 函数重写

--Video

-4.3 虚函数

--Video

--Video

-4.4 自动类型转换

--Video

-4.5 禁止自动类型转换

--Video

-4.6 强制类型转换

--Video

-4.7 函数模板

--Video

-4.8 类模板

--Video

-4.9 成员函数模板

--Video

-4.10 模板特化

--Video

-作业四--作业

第五讲 找到对象,确定接口

-5.0 引言

--Video

-5.1 从FOP到OOP

--Video

-5.2 对象在哪里

--Video

-5.3 接口在哪儿

--Video

-5.4 实现接口

--Video

-5.5 变与不变:多态的威力

--Video

第六讲 算法横向拆分,分离步骤

-6.0 引言

--讨论

-6.1 从负载监视器的设计开始

--从负载监视器的设计开始

-6.2 接口的分离与单一责任原则

--接口的分离与单一责任原则

-6.3 委托与接口的进一步分解

--委托与接口的进一步分解

-6.4 分离不同层面的可变性

--分离不同层面的可变性

第七讲 算法纵向拆分,分离表示

-7.0 引言

--Video

-7.1 迭代器

--Video

-7.2 迭代器的实现

--Video

-7.3 迭代器与模板

--Video

-7.4 算法与数据的解耦

--Video

-7.5 抽象结构与类模板

--Video

-7.6 函数对象与算法分解

--Video

-7.7 基于模板的策略模式

--Video

第八讲 基于接口组合,应对复杂变化

-8.0 引言

--Video

-8.1 已有资源的组合

--Video

-8.2 适当引入接口

--Video

-8.3 接口不变时的功能变化

--Video

-8.4 装饰

--Video

-8.5 责任的传递与责任链

--Video

-8.X 小结

--Video

第九讲 增加抽象层级,隔离复杂变化

-9.0 引言

--Video

-9.1 通过封装增加隔离、应对变化

--Video

--Video

-9.2 增加抽象层,应对变化

--Video

--Video

-9.3 相互关联对象的创建

--Video

-9.4 示例:自动组卷系统设计

--Video

-9.5 设计思路(上)

--Video

-9.6 设计思路(中)

--Video

-9.7 设计思路(下)

--Video

-9.X 小结

--Video

-课程总结

--Video

期末考试

-期末考试--作业

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。