📜  什么是运行时多态性 (1)

📅  最后修改于: 2023-12-03 14:49:14.442000             🧑  作者: Mango

运行时多态性

运行时多态性是面向对象编程中的一个重要概念。它允许程序在运行时根据具体的对象类型来调用对应的方法或属性,使得程序更加灵活和可扩展。

什么是多态性

在面向对象编程中,多态性指的是同一个方法或属性可以被不同类型的对象调用,产生不同的行为。例如,假设有一个Animal类和它的子类DogCat,它们都有一个makeSound()方法:

class Animal:
    def makeSound(self):
        pass

class Dog(Animal):
    def makeSound(self):
        print("Woof!")

class Cat(Animal):
    def makeSound(self):
        print("Meow!")

那么现在如果我们创建了一个Dog和一个Cat对象,可以调用它们的makeSound()方法,得到不同的结果:

dog = Dog()
cat = Cat()

dog.makeSound()  # 输出 "Woof!"
cat.makeSound()  # 输出 "Meow!"

这种能力使得不同类型的对象可以以一种相似的方式使用,而无需关心具体的类型。

静态多态性和动态多态性

多态性可以分为静态多态性和动态多态性两种类型。

静态多态性是在编译时确定的,也称为编译时多态性。例如,函数重载就是静态多态性的应用,因为它的重载行为在编译时就已经确定了。

动态多态性是在运行时确定的,也称为运行时多态性。例如,上面的makeSound()方法就是动态多态性的应用,因为它的实际行为是根据对象类型动态决定的。

实现运行时多态性

在大多数面向对象编程语言中,实现运行时多态性通常需要两个条件:

  • 继承:子类必须继承父类,以便子类可以重写父类的方法或属性。
  • 虚函数或者抽象函数:父类必须有至少一个虚函数或者抽象函数,以便子类可以重写它。

在Python中,所有的方法都是虚函数,因此无需使用特殊的关键字(如virtualabstract)来标记。只需要在子类中定义同名的方法,就可以重写父类的方法。另外,Python还提供了super()函数来调用父类的方法。

class Animal:
    def makeSound(self):
        pass

class Dog(Animal):
    def makeSound(self):
        super().makeSound()  # 调用父类的 makeSound() 方法
        print("Woof!")

class Cat(Animal):
    def makeSound(self):
        super().makeSound()  # 调用父类的 makeSound() 方法
        print("Meow!")

在这个例子中,子类DogCat都重写了父类AnimalmakeSound()方法,并且使用super()函数调用了父类的makeSound()方法。这样,无论是调用Dog对象的makeSound()方法还是调用Cat对象的makeSound()方法,都会先调用父类的makeSound()方法,然后再输出子类自己的声音。

总结

多态性是面向对象编程中的重要概念,它使得程序更加灵活和可扩展。运行时多态性是一种动态多态性,它能够让程序根据具体的对象类型来调用对应的方法或属性。在Python中,可以通过继承和重写父类的方法来实现运行时多态性。