0001_为什么使用多态

发布时间 2023-04-22 01:54:25作者: 猪无名

为什么使用多态


让我们用一点代码来说明问题,假设代码中有三个class: 自行车(Bicycle)、汽车(Car)和卡车(Truck),这三个class分别有这样三个实现:Ride()、Run()、Launch(),实际上都是让它们发动起来,如果没有多态的话我们该怎样开动它们呢?(注意这里没有采用特定语言,因为多态是一个通用的概念)

// 实现
Bicycle bicyle = new Bicycle();
Car car = new Car();
Truck truck = new Truck();

// 使用部分
bicyle.Ride();
car.Run();
truck.Launch();

注意,以上代码包含了两部分:
一部分是类的实现;
另一部分是类的使用,意识到这一点对于理解多态非常关键。

现在我们已经知道了使用类的代码包含两部分,在这样的代码实现中如果Bicyle的接口修改了,那么使用部分的代码同样需要修改,这是程序员所不想看到的。如果有多态会怎样呢?

实际上自行车(Bicycle)、汽车(Car)和卡车(Truck)都是交通工具(Vehicle),把它们发动起来都是让它们Run起来,因此,如果有多态的话我们可以这样写代码:

// 实现部分
List<Vehicle> vehicles = {  new Bicycle(),
                            new Car(),
                            new Truck()  };
// 使用部分
for (v : vechicles)
  v.Run();

怎么样,代码是不是一下就简洁多了,最棒的是不管实现部分代码怎么改动都不会影响到使用部分的代码,实际上你可以往vehicles中增加任意多对象都不会影响到使用部分,这就是设计模式当中所谓的"只针对抽象编程,而不是针对实现编程"。

因此我们可以看到,尽管自行车、汽车、卡车是不同的东西,但是当我们将其抽象为交通工具后就可以一视同仁的对待它们,这就是多态。

现在你应该理解什么是多态以及为什么需要多态了吧。

当然为了实现多态,类的定义要稍稍改动一下:

class Vehicle {       // 新增抽象类
    void Run() {}
}

class Bicycle: Vehicle {
    void Run() {......} // Ride修改为Run
}
class Car: Vehicle{
    voie Run() {......} // 无需改动
}

class Truck: Vehicle {
    void Run() {......}  // Launch修改为Run
}

实际上如果你仔细想想的话整数和浮点数就是一种多态,因为你可以把一个整数和一个浮点数相加,也就是以相同的方式使用它们,尽管整数和浮点数是两个不同的数据类型。


总结:

多态可以让程序员针对抽象而不是具体实现来编程,这样的代码会有更好的可扩展性。

当然为了使用多态你需要进行抽象,也就是定义一个接口让不同的对象去实现,这样从这个接口的角度看各个对象就一样了,因此可以以一致的方式来使用这些不同类型的对象,这就是多态的威力。

解释来源:https://zhuanlan.zhihu.com/p/191617344