一天一个知识点——如何实现多态

173 阅读3分钟

概念

  • 多态是面向对象编程的一个重要特性,指同一个行为,具有多种表现形式
  • 多态主要又可分为编译时多态和运行时多态。编译时多态的表现形式为“方法重载”,而运行时多态的表象形式为“继承和方法重写”。下面我们主要介绍的是运行时多态。

示例

动物(Animal)类别,继承出类别鸡(Chicken)和类别狗(Dog),Chicken和Dog对于源自父类的消息会有不同的响应,例如,类别动物有“叫()”之动作,而类别鸡会“啼叫()”,类别狗则会“吠叫()”,这就是多态。

前提条件

1. 继承:多态一定发生在子类和父类之间;
2. 重写:子类重写父类的方法。

实现

父类的引用指向子类的实例对象。

Java中多态的实现

  1. 实现父类和子类的代码编写,其中子类要重写父类的方法
  2. 定义一个父类的变量a
  3. 将定义好的父类变量a指向不同的子类实例对象
  4. 通过变量a调用具体的方法
class Animal {
    public Animal(){}
    public void say(){
        System.out.println("叫");
    }
}

class Dog extends Animal{
    public Dog(){}
    public void say(){
        System.out.println("吠叫");
    }
}

class Chicken extends Animal{
    public Chicken(){}
    public void say(){
        System.out.println("啼叫");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a;
        a = new Chicken();
        a.say();
        a = new Dog();
        a.say();
    }
}

Python中的多态实现

由于Python是弱类型语言,即在使用变量时,不需要指定变量的具体类型,因此,Python中的多态实现和Java类似,关键在于:同一个变量指向不同的子类实例对象。

class Animal:
    def say(self):
        print("叫")

class Dog(Animal):
    def say(self):
        print("吠叫")

class Chicken(Animal):
    def say(self):
        print("啼叫")

a = Animal()
a.say()

a = Dog()
a.say()

a = Chicken()
a.say()
  • 由于Python是一种动态语言,它的使用更为灵活,因此在Python中还可以使用鸭子类型来实现多态。所谓鸭子类型,比较通用的解释是:“ 当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
  • 鸭子类型和多态的区别在于,多态要求严格的继承体系,需要定义一个父类的变量,指向子类的实例对象,而鸭子类型不强制指向子类的实例对象,只要指向的实例对象包含有相应的方法即可。也就是说,多态关注对象类型,而鸭子类型只关注对象的行为。
  • 在鸭子类型中,可以将子类的实例对象作为函数参数,从而根据给定参数所属的子类类型来确定最终的“行为”。
class WhoSay():
    def say(self,who):
        who.say()

class Animal:
    def say(self):
        print("叫")

class Dog(Animal):
    def say(self):
        print("吠叫")

class Chicken(Animal):
    def say(self):
        print("啼叫")

a = WhoSay()
a.say(Animal())
a.say(Chicken())
a.say(Dog())

总结

  1. 多态是面向对象编程语言的一种特性,即同一个行为,具有多种表现形式;
  2. 在Java和Python中,实现多态的关键都在于:父类引用指向子类的实例对象;
  3. 由于Python语言更为灵活,更关注对象的行为,不强制对象的类型,因此,还可以使用鸭子类型来实现多态。