blog icon indicating copy to clipboard operation
blog copied to clipboard

真正的理解多态、什么是多态、多态的使用场景

Open wuweijia opened this issue 3 years ago • 0 comments

发布于 2021-11-16

什么是多态

最近面试面向对象是我必问的问题,大部分人能回答出三大特性,封装、继承、多态。 继承和封装靠字面意思还能解释一下,大部分人不知道什么是多态

维基百科

在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口或使用一个单一的符号来表示多个不同的类型

??? 我看完还是有点懵

再看《设计模式》里面相关的介绍

“多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态。

哦哦哦,大概懂了?

再看比较非科班通俗易懂的解释

多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。

这么一看,这就跟我们村上广播喇叭播放村委会通知。各家各户做的响应不一样差不多嘛。

村委会:下面播放一条通知,今天晚上8点,村头播放电影《全村的希望》,欢迎各家各户前来观看。 各家各户:有的开始炒瓜子准备去看电影,有的在蹦爆米花,有的在买糖,有的在打尿炕的小朋友

道理说了这么多,代码上要怎么体现多态的用处?如果用业务解释多态呢? 下面我们一一分析

代码举栗

var makeSound = function( animal ) {
  if ( animal instanceof Duck ) {
    console.log( '嘎嘎嘎' );
  } else if ( animal instanceof Cat ) {
    console.log( '喵喵喵' );
  }
}

var Duck = function() {}
var Cat = function() {}

makeSound(new Duck());
makeSound(new Cat());

输出

嘎嘎嘎 喵喵喵

但是我们如果在想加个 “汪汪汪” 就需要修改 makesound 函数 增加一条 else if 语句,这是一种不好的现象,至于为什么是另一个话题,我们知道他不好就行了。那要怎么搞呢?

看我们如何利用_多态_消除 if else

var makeSound = function( animal ) {
  animal.sound();
}

Duck.prototype.sound = function() {
    console.log( '嘎嘎嘎' );
}
Cat.prototype.sound = function() {
  console.log( '喵喵喵' );
}

var Duck = function() {}
var Cat = function() {}

makeSound(new Duck());
makeSound(new Cat());

输出

嘎嘎嘎 喵喵喵

增加一个 “汪汪汪”

var Dog = function() {}

Dog.prototype.sound = function() {
  console.log( '汪汪汪' );
}

这样的话,我们只需要关注每个人在做什么就可以了。无论什么时候通知看电影,小王家里做的事情永远不会对其他人产生影响,如果我们把每家每户要干什么,放在村委会去管理,就会产生耦合和混乱。

现在大家应该理解多态了吧

wuweijia avatar Nov 16 '21 03:11 wuweijia