为什么要使用多态?
在程序员实际的编程中创建一个类的时候会定义的由那些行为(这里假设创建的类都需要继承)。但是不会去具体的定义这些行为的细节。就好像我们创建一个交通工具的类的时候,不会在创建的时候就去考虑他是如何行驶的。如果把可能行使的情况都考虑到的话那就太繁琐了。将其具体的行为在交通工具的子类中实现。
Vehicle car=new Car();
Vehicle boat=new Boat();
Vehicle plane=new Plane();
例如像上面一串代码,由于在声明car,boat,plane对象时我们还不需要的知道实现行为的具体细节,所以在编译器编译的时也不会知道到底该执行哪一段代码,那么它应该怎么办呢?
这个问题的答案,也是面向对象程序设计的最重要的诀窍:一个非面向对象编程的编译器产生函数调用会引起所谓的“前期绑定”,也就是在编译时就要精确到具体的代码。然而面向对象编程的编译器使用了”后期绑定“的概念,编译时确保被调用方法的存在,并对调用参数和返回值执行类型检查。而被调用的代码直到运行时才确定。(这样做可以让如上的代码在编译时顺利通过,不会产生编译时错误)。
void something(Vehicle vehicle)
{
vehicle.move();
}
再来看个例子,上图这个函数可以传进来整个类族(也就是父类Vehicle和所有子类),并且程序员在新加一个子类时,并不需要考虑修改这段代码。而这段代码在编译时是不知道具体要调用的move函数是那个类的函数,只有运行时才知道。
并且在面向对象的语言中的类就相当于一个数据类型,让程序员不再局限于已有的那些数据(整型,浮点型……),可以通过需要来添加新的数据类型来扩展编程语言。例如我创建一个Person类(类比于整型),然后实例化多个对象(类比多个整型数字),然后给这些对象发送指令进行操作(类比于整型数字做计算)。注意这里的操作有很多种可能,不再局限简单的计算,也可以理解为一个对象向另一个对象发送一条或多条消息,然后消息再反馈。这种创建数据类型的高自由和定义其之间的操作的高自由是面向对象中极具魅力的一点。