[Day 007.01 of C#] 面向对象的概念 —— 万物皆可对象

Day 007.01

part 098.

面向对象的概念


  • 对象一定是看得见摸得着的东西,要精确到某一个具体的实物上,不要泛指。

  • 面向过程: 面向的是完成这件事的过程,强调的是完成这件事的动作
    举例: 把大象塞进冰箱里

  1. 打开冰箱门
  2. 把大象塞进去
  3. 关闭冰箱门

在上面的过程中,强调了三个动作,分别是"打开""塞""关闭"
并没有强调人的存在,没有强调冰箱,没有强调大象,而强调的只有三个动作
这便是面向过程的思想

  • 面向对象: 找个对象帮你做事儿。意在写出一个通用的代码,屏蔽差异

举例: 小冰把大象塞进冰箱里

  1. 打开冰箱门
  2. 把大象塞进去
  3. 关闭冰箱门

在上面的过程中,出现了三个对象,分别是"小冰""大象""冰箱"
若把人(小冰)作为对象,那所体现的思想就和面向过程一样了。而我们使用面向对象,就是要尽量地去屏蔽人与人之间的差异,写出一个通用的代码,适用于所有人。
若把大象作为对象,那么第1、3件事情就没有什么关系,没有什么卵用
于是我们把冰箱作为对象,因为在上面三个过程中,每一个过程都涉及到了冰箱。
那怎么解决呢?

  1. 冰箱门可以打开 (由主动变成了被动)
  2. 大象可以塞进冰箱 (由主动变成了被动)
  3. 冰箱门可以关闭 (由主动变成了被动)

在上面,这样做基本上屏蔽了人与人之间的差异,不管小冰和保密的强壮与否,只要调用每一步的方法,就可以做相应的事情。至于具体怎么做到的不需要了解,只需要知道这个方法就能够做到。这样便消除了所有人之间的差异,写出了一个通用的代码。


两者的对比

为什么会由面向过程的编程思想转变到面向对象的编程思想呢?

面向过程

举例1: 让小冰把大象塞进冰箱里,假设小冰长得很弱小,而冰箱又好高好高

  1. 那么这时小冰就打不开冰箱门,于是就踩着小板凳打开冰箱门
  2. 又因为太弱小搬不动大象,又找保密帮忙把大象塞进冰箱里
  3. 最后小冰又踩着小板凳把冰箱门关了

举例2:让保密把大象塞进冰箱里,假设保密高大无比,有着硕大的肌肉

  1. 于是保密就可以小手一挥打开冰箱门
  2. 一只手把大象塞进去,都不用找人帮忙
  3. 小手一挥又可以把冰箱门关了

上面两个例子中,是两个不同的人去做同一个事情,但完成的方式都不一样。
如果用面向过程的思想去解决这个问题时,当执行这些事情的人不同的时候,也就必须为每个不同的人量身定制不同的方式 去解决这些问题

需求更改: 把大象塞进冰箱里

  1. 打开冰箱门
  2. 把大象塞进去
  3. 亲亲大象的屁屁
  4. 关闭冰箱门

举例1: 让小冰把大象塞进冰箱里,假设小冰长得很弱小,而冰箱又好高好高

  1. 那么这时小冰就打不开冰箱门,于是就踩着小板凳打开冰箱门
  2. 又因为太弱小搬不动大象,又找保密帮忙把大象塞进冰箱里
  3. 小冰再踩着小板凳去亲亲
  4. 最后小冰又踩着小板凳把冰箱门关了

举例2:让保密把大象塞进冰箱里,假设保密高大无比,有着硕大的肌肉

  1. 于是保密就可以小手一挥打开冰箱门
  2. 一只手把大象塞进去,都不用找人帮忙
  3. 然后不用别人帮忙,自己就可以亲亲
  4. 小手一挥又可以把冰箱门关了

面向过程的好与坏

好就好在和人的正常思维是一模一样的
坏就坏在需要为每个不同的人定制一个方法来解决,会好麻烦。如果体现在代码里,那么每个人实现的方法也都不一样。

面向对象

  • 依然是把大象塞进冰箱
  1. 冰箱门可以打开 (由主动变成了被动)
  2. 大象可以塞进冰箱 (由主动变成了被动)
  3. 冰箱门可以关闭 (由主动变成了被动)

让小冰来做:

  • 小冰调用了第一个方法 ==>冰箱门被打开了。具体怎么打开的,小冰不需要知道。他只需要知道调用这个方法,就可以把冰箱门打开。具体是要踩着凳子,还是找保密来帮忙,完全不需要明白。总之最终的结果,就是冰箱门被打开了
  • 小冰调用了第二个方法 ==> 大象被塞进冰箱了。具体...同上理
  • 小冰调用了第三个方法 ==> 冰箱门被关闭了。 具体...同上理

保密来做:

  • 保密调用了第一个方法 ==> 冰箱门被打开了
  • 保密调用了第二个方法 ==> 大象被塞进冰箱了
  • 保密调用了第三个方法 ==> 冰箱门被关闭了

在上面,也是两个不同的人去做同一件事情,但是并没有突出人的特征,完全屏蔽了人与人之间的差异。这便是面向对象的好处: 找一个对象屏蔽所有人之间的差异,写出一个通用的代码。

总之,
面向过程是日常中的思想,过分地强调了人的出现。
面向对象不再强调人了,而强调的对象,虽然这个对象有时也可能是人


找对象小窍门 —— 万物皆对象

面向过程的关门:
(谁是怎么怎么关门的)
小熊猫一脚把门踹禁了
小冰轻轻把门带上了
保密门没关严,留了个小尾巴

面向对象的关门:
(门是对象,通常是被动的)
门可以被关闭

所以,在找对象的时候,通常找被动的东西。可以这么理解:
"把"字句改成"被"字句


属性和方法

描述小冰和保密的特征和行为:
小冰:
姓名: 小冰
性别: 男
身高: 175cm
体重: 57kg
年龄: 14
肠胃炎

保密:
姓名: 保密
性别: 男
身高: 172cm
体重: 51kg
年龄: 20
一切健康

在代码中描述一个对象,要通过描述这个对象的属性和方法。

  • 属性: 对应的就是特征
  • 方法: 对应的就是行为

对象一定是看得见摸得着的东西,要精确到某一个具体的实物上,不要泛指。

举例: 显示器上的灯的属性和方法
属性:
外形: 长条的
亮度: 10W
颜色: 白白的
牌子: yeelight

长条的、10W、白白的、yeelight就是属性的值

方法:
发光


对象的共性

  • 共性就是共同拥有的属性和方法

举例:
银行门前停着的劳斯莱斯,家门口的小绵羊,隔壁的小货车,同学的自行车
它们共同拥有的属性: 都有品牌、都有价位...
它们共同拥有的方法: 都能载人、都能跑路
所以这些对象既有共同拥有的属性、方法, 也有不同的、独有的属性、方法

  • 我们把这些具有相同属性和相同方法的对象进行进一步封装,抽象出来 这个概念。
  • 类就是个模子,确定了对象应该具有的属性和方法

所以,我们就可以把上面这些具有相同属性和相同方法的对象抽象出一个类: 车车

  • 对象是根据类创建出来的
  • 类是一个虚无缥缈的东西
  • 类就是一个盖大楼的图纸,而对象就是改出来的大楼
  • 类包含对象,两者是包含的关系。

sentences

"把"字句改成"被"字句


:3

posted @ 2022-03-26 13:16  冰导有盒饭  阅读(47)  评论(0)    收藏  举报