当前课程知识点:面向对象程序设计(C++) >  第五讲 找到对象,确定接口 >  5.2 对象在哪里 >  Video

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

Video在线视频

Video

下一节:Video

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

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

刚才我们用了一个简单的例子

看了一下怎么样把一些

一个问题给它封装成对象

并且介绍了一下什么是接口和实现

或者说隐藏这些关系

下边我们来看看

一个相对复杂一点的问题

在这个问题里面

怎么样从中抽象出或者抽出

找到合适的这种概念

把它封装成类

这个问题是这样的

这是看起来像是个小学奥数题

大家可以看一下

我们有四位同学

其中有一位做了点好事

但没留名

那么在表扬信来了之后

那么这个校长就去问

到底谁干的好事

四个同学A B C D

A说不是我干的

B说是C干的

C说是D

D反驳不是我

是他胡说

现在我们知道

这四个人里边有三个说了真话

剩下一个人说了假话

那么到底是谁干的好事呢

其实程序想起来也很好做对吧

我们看一下这个

FOP的面向流程的实现

很简单

我只要说先假设这个人

是A到D这四个人

然后针对这四种情况

我去分别判断这三句话是不是对的

是不是正好有三句话是对的

如果正好有三句话是对的

那好

这就是我们要找的这个结果

这段程序其实很好理解

但是我们

现在要用OOP的方式去思考问题的话

我们就要去看这里面

有哪些部分是可变的部分

我们看一下这里面哪些可变

首先第一个可变的

询问范围可变

到底有几个同学啊

咱们说四个同学

完全是可以是三个 五个

十个 八个

第二个每位同学说的话

是可变的对吧

再就是

第三个就是说

到底有几句话是对的

这也应该是可变的

那么我们看到这三个可变的部分

都要反映到什么里头呢

其实我们可以

把这个算法进行

一个简单的抽象一下

我们看一下这个抽象的算法

实际上我们是

便利可能做好的所有同学

然后针对每个可能性

去验证每句话的真假

如果刚好真话的数量

和要求的真话数量是相等的

那么我们就得到了我们的这个结果

这是我们的算法

抽象算法的这个样子

那么这里面哪些是可变

哪些是不变的呢

我们总结一下

可变的有哪个同学

几个同学判断是对的

哪个同学对

谁做的好事

的这个判断什么样子

相应的就可以描述为

有多少同学是一个整数参数

有几个同学的判断是对的

也是一个整数参数

一个correct

那么对每个同学

对谁做的好事这个判断

实际上对应的是一个

每一个同学对应的

能做判断的这一个特殊的函数

那么这个特殊函数

说它特殊

哪特殊

因为每一个同学他对应一句台词

每一个同学他都有他自己的台词

他要根据他说那句台词

来判断如果是谁谁做的好事

那么我这句台词是不是真的

是不是对的

那么他这个函数

里边对应的一句台词

他要根据这台词去判断

这个台词意味着什么

是一种状态

这是一个有状态的函数

它不是一个简单的不变的函数

那么这种有状态的函数

就比我们传统的那种

就是我们C语言里面那种函数

复杂了一些

它这个状态是什么

一句台词

然后这个台词

一般包含两部分限定条件

什么

他是谁不是谁

两个判断对不对

是谁不是谁

等于不等于

那个谁就是某个人

那么这状态就是

对应于这么两部分的限定条件

那怎么把这个状态

放到函数里边去呢

咱们之前其实干过什么事

把函数放到数据里边

跟数据捆到一起去

叫封装

但我们现在反过来

把数据放到函数里边去

咱们都知道加法交换率

A+B等于B+A

在这里其实

也可以去把它这么推断

数据加函数是封装成类

那函数加数据其实也是封装成类

怎么实现

我们看这个例子

这里面我们定义了

一个叫student的这么一个类

这个类里边

它包含了一个theman isequal

这么两个成员变量

实际这就是我们说的状态

因为我们刚才说了

这句台词包括是不是某个人

是不是就是这个isequal

某个人就是theman

因为它是函数啊

函数必须能调用啊

能调用这个要求

对于我们的这个类来讲就是

要重载括号这个操作符

那么我们这里面就定义了一个

operator括号

然后参数是isequal

用这种方式让这个类

具有了能调用的能力

接下来我们就看到了

这样一段代码

我们看一下这段代码

OOP版的

谁做的好事

我们定义了一对student

这对student它们被作为一个宿主

传给了一个叫solve的这么一个函数

这个函数带三个参数

4是代表着有四个同学

3代表着有三句真话

然后一个宿主

这是每一位同学说的那个话

然后这个solve这个函数

实际上是对所有的同学进行便利

然后便利过程实际上就是

假定thisman是谁

然后对所有的话进行一遍这种调用

调用了之后把这个

有多少正确的

和需要正确的话数进行比较

一看如果是相等

那么就是这个同学

当然了这里面

又多了一个return0这么一个结果

它代表着我们没有找到

这是一个必要的

这种出错的控制的一个手段

我们这么做之后得到了什么好处呢

当我们题目发生变化的时候

这回是N位同学做了好事

然后每一个同学说的话

也都不一样了

不是刚才那几句话

变成别的样子了

我们现在有M个同学说的是真话

那么这时候我们的程序

其实就可以很简单的

应对这种变化了

怎么应对呢

大家可以自己思考一下

面向对象程序设计(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笔记与讨论

也许你还感兴趣的课程:

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