Skip to content
文档章节

多态

多态(polymorphism)是面向对象编程重要的思想。多态关心的是对象有什么方法,而不是关心对象是谁,只要某个对象拥有需要的方法,那么该对象就可以使用。

经典的例子是,猫和狗都是动物,都有吃饭和睡觉的动作,如果是一头猪,也是动物,也会有吃饭和睡觉的动作。

Java 语言中实现多态是将 猫,狗,猪 等转换成更高一级的动物类型,无论是那种动物来了,都可以执行 吃饭,睡觉了。

JS 语言中,由于没有静态类型转换,因此不需要转换成高一级的类型,而是直接执行相应的方法。

多态减少了代码中 if else 的使用,不用关注对象类型,而是关注对象行为。如果没有对象,则我们的代码是这样的,难以维护

js
function eat(animal) {
  if(animal instanceOf  Dog) {
    console.log('dog eat')
  } else if(animal instanceOf Cat) {
    console.log('cat eat')
  } else if(animal instanceOf Elephant) {
    console.log('elephant eat')
  }
}

可以看到有非常多的 if else, 每次需要判断对象类型。我们的代码可以只关注对象行为,只要是 animal, 只要调用其方法就行。 也就是说可以将类型隐藏在其父类型之后,父类不用关注子类型的具体类型,只需要关注方法即可。

js
function(animal) {
  animal.eat()
}

Java 中使用说明

Java 中将某种类型隐藏在高一级类型下,从而执行高类型方法。

下面例子中, cat, dog 都是 继承了 animal, 因此可以将 cat 和 dog 转换成 Animal 类型, 然后执行相应方法。

java
public abstract class Animal {
  public void eat();
  public void sleep();
}

public class Cat extends Animal {
  public void eat() {
    System.out.println('cat eat');
  }

  public void sleep() {
    System.out.println('cat sleep');
  }
}


public class Dog extends Animal {
  public void eat() {
    System.out.println('dog eat');
  }

  public void sleep() {
    System.out.println('dog sleep');
  }
}

public class AnimalDaily {
  public vlid daily(Animal animal) {
    animal.eat();
    animal.sleep();
  }
}

public class Test {
  public static void main(String args[]) {
    AnimalDaily animalDaily = new AnimalDaily()
    Animal cat = new Cat();
    Animal dog = new Dog();

    animalDaily.daily(cat)
    animalDaily.daily(dog)
  }
}

JS 中使用

由于 JS 不关注类型,而是关注方法,因此可以直接调用其方法

js
function Cat() {}

Cat.prototype.eat = function () {
  console.log('cat eat');
};

Cat.prototype.sleep = function () {
  console.log('cat sleep');
};

function Dog() {}

Dog.prototype.eat = function () {
  console.log('dog eat');
};

Dog.prototype.sleep = function () {
  console.log('dog sleep');
};

function daily(animal) {
  if (animal && typeof animal.eat === 'function') {
    animal.eat();
  }

  if (animal && typeof animal.sleep === 'function') {
    animal.sleep();
  }
}

daily(new Cat());
daily(new Dog());