概念
- 多态是面向对象编程的一个重要特性,指同一个行为,具有多种表现形式。
- 多态主要又可分为编译时多态和运行时多态。编译时多态的表现形式为“方法重载”,而运行时多态的表象形式为“继承和方法重写”。下面我们主要介绍的是运行时多态。
示例
动物(Animal)类别,继承出类别鸡(Chicken)和类别狗(Dog),Chicken和Dog对于源自父类的消息会有不同的响应,例如,类别动物有“叫()”之动作,而类别鸡会“啼叫()”,类别狗则会“吠叫()”,这就是多态。
前提条件
1. 继承:多态一定发生在子类和父类之间;
2. 重写:子类重写父类的方法。
实现
父类的引用指向子类的实例对象。
Java中多态的实现
- 实现父类和子类的代码编写,其中子类要重写父类的方法
- 定义一个父类的变量a
- 将定义好的父类变量a指向不同的子类实例对象
- 通过变量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())
总结
- 多态是面向对象编程语言的一种特性,即同一个行为,具有多种表现形式;
- 在Java和Python中,实现多态的关键都在于:父类引用指向子类的实例对象;
- 由于Python语言更为灵活,更关注对象的行为,不强制对象的类型,因此,还可以使用鸭子类型来实现多态。