深色模式
多态
多态(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());