浅谈面向对象

什么是对象?

将对象看做是一个特别的变量,它是一个可以存储数据的东西,除此之外,你还可以要求它在自身上进行操作。理论上而言,万物皆对象,可以抽取待求解的任何概念化构件,例如猫、狗、建筑物、衣服等等。我们可以将他们表示成为程序中的对象。通常情况下, 对象是指一块能存储数据并具有某种类型的内存空间

什么是面向对象?

把现实世界里的具体物体或者逻辑世界的逻辑物体,用抽象手段,把这些物体抽象成程序能够识别的类,使类具备物体的属性和行为,把物体与物体之间的关联转换成类与类之间的关联,用编程逻辑把这些关联表示出来设计成程序,也就是面向对象设计。

为什么要用面向对象?

通过定义我们知道面向对象是用来解决物体与物体之间的关联的一种方式,除了这种方式还有很多其他方式比如面向过程。解决问题的方式很多,但是最好的只有一个,在代码的世界里我们不仅要考虑功能的实现,还要考虑后期后期的维护,用面向对象的思想编写代码比其它方式,能让程序更好的维护

面向对象三大特征

  • 封装

    • 将一些基本数据类型复合成一个自定义类型。
    • 向类外提供必要的功能,隐藏实现的细节。
    • 提取不变的细节,隔离变化点
  • 继承

    复用现有类的功能与概念,并在此基础上进行扩展

  • 多态

    封装和继承几乎都是为多态而准备的

    父类的同一种动作或者行为,在不同的子类上有不同的实现。

    • 继承的存在(继承是多态的基础,没有继承就没有多态).
    • 子类重写父类的方法(多态下调用子类重写的方法).

    ps: 类的静态方法,只能继承不能重写

面向对象实例

以游戏角色举例:

每个英雄都有不同属性:生命值,魔法值,移动速度
英雄会 : 受伤,减速,死亡等等…

不可能每为一个英雄编写属性,都写一遍上述方法。所以需要使用面向对象思想将不变的抽象出来封装,每个英雄继承自这个类,实现每个英雄不同的属性(多态)

定义Hero类,类中实现初始属性,受伤,减速,死亡等等方法
每个英雄继承Hero类,初始化属性则读取对应配置文件,受伤时调用的受伤方法即可

面向对象的六大设计原则

  • 开-闭原则(目标、总的指导思想)

    对扩展开放,对修改关闭。增加新功能,不改变原有代码。

  • 类的单一职责(一个类的定义)

    一个类有且只有一个改变它的原因。

  • 里氏替换(继承后的重写,指导继承的设计)

    客户端代码(调用的类)尽量依赖(使用)抽象的组件。

  • 依赖倒置(依赖抽象)

    父类出现的地方可以被子类替换,在替换后依然保持原功能。

  • 迪米特法则(类与类交互的原则)

    类与类交互时,在满足功能要求的基础上,传递的数据量越少越好。

  • 组合复用原则(复用的最佳实践)

    如果仅仅为了代码复用优先选择组合复用,而非继承复用。

类与类之间的关系

  • 泛化 / 继承

    泛化就是有子类抽象出一个父类
    而继承就是由父类具体化一个子类(子类继承父类)
    浅谈面向对象

  • 组合 / 聚合 / 关联

    部分与整体的关系,功能的复用,变化影响一个类
    浅谈面向对象

  • 依赖

    合作关系,一种相对松散的协作,变化影响一个方法
    浅谈面向对象