当前课程知识点:面向对象程序设计(C++) > 第五讲 找到对象,确定接口 > 5.2 对象在哪里 > 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个同学说的是真话
那么这时候我们的程序
其实就可以很简单的
应对这种变化了
怎么应对呢
大家可以自己思考一下
-1.0 课程定位、教学内容
-1.0 课程定位、教学内容--作业
-1.1 编程环境与工具
--源程序拆分
-1.2 main函数的命令行参数
-作业一--作业
-2.1 变量定义
--变量定义
-2.2 变量的初始化、类型推导与基于范围的循环
-2.3 函数重载
--函数重载
-2.4 函数参数的缺省值与追踪返回类型的函数
-2.5 类的定义
--类的定义
-2.6 类成员的访问权限与友元
-第二讲 基础语法(1)--作业二
-3.1 构造函数析构函数
--构造函数析构函数
-3.2 赋值运算符重载
--赋值运算符重载
-3.3 流运算符重载
--流运算符重载
-3.4 函数运算符重载
--函数运算符重载
-3.5 下标运算符与自增减运算符重载
-3.6 静态成员与常量成员
-3.7 对象组合
--对象组合
-3.8 移动构造函数
--Video
--Video
-3.9 default修饰符
--Video
-第三讲 基础语法(2)--作业三
-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
-期末考试--作业