面向对象的故事

55 阅读2分钟

需求:在图形接口画出正方形,圆形和三角形,当用户点选图形时,图形需要顺时针转360度并依据形状的不同播放不同的AIF音效文件

这里有阿珠跟阿花两个程序员

阿珠想:这个程序需要执行什么动作?需要rotate和playSound,然后她就开始进行设计的工作。

阿花想:这个程序需要什么样的事物?有什么关键角色?她首先想到形状体(shape),还有用户,声响等对象与点击事件,然而这些对象早就已经建立好了,所以她只要专注于创建形状体就行了。

阿珠:写了rotate和playSound两个方法

// 形状

const rotate = (type, self) => {
   // 根据不同的类型,执行旋转的方法
}

const playSound = (type, self) => {
   // 根据不同的类型,执行旋转的方法
}

转换成

// 也可以实现多态的效果
function fn(classArgs) {
  // ....
}

阿花:为3个形状各写出一个类。每个类中都有rorate和playSound方法

class parent {
  rotate() {}
  playSound() {}
}
// 正方形
class Mod extends parent {
  
}

// 圆形
class Mod extends parent {
  
}

// 三角形
class Mod extends parent {
  
}

function fn(classArgs) {
  // ....
}

如果这是需求增加,要求加上阿米虫原虫形状,用户点选时也是旋转并播放.hif声音文件。

对于阿珠来说就麻烦了,要在方法中进行判断,如果不是阿米虫先查询播放哪个AIF文件,然后播放,如果是阿米虫就播放.hif。

对于阿花来说,不需要动到已经测试好的程序就可以达到新目标,面向对象的适应性与可扩展性让她面对修改时不会太过于痛苦

如果现在需要更改阿米虫的旋转方式。

对于阿珠来说,就需要更改rotate()函数,并且要加入额外的参数,还要进行选择,本来已经测试好的东西全部都要重来一遍

对于阿花来说,只需要修改阿米虫这一个类的方法而已。其他的代码都不需要修改。

阿珠这时说,阿花的代码有重复。那么这时,阿花可以利用面对对象的继承

找出四个类的共同的部分,取出新的类,然后让四个类继承这个类,子类会自动获得父类的功能,这样就解决了代码重复的问题

子类的方法可以覆盖父类的方法,Java虚拟机在遇到不同的子类时会使用不同的方法。

覆盖的意思就是让子类重新定义继承下来的方法,以改变或延伸此方法的行为。

封装 class 或者说一个对象 继承 原型链 多态 用子类代替父类,或者用父类代替子类

// 定义型参是父类,但是传入的时候可以传子类,
function (class parent) {

}