无编码解释的协差和逆差

2020-09-23 00:29:27

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

协变和逆变是在使用面向对象编程时可能会遇到(并且最初会被混淆)的概念。本文解释了基本思想,不需要任何编程知识。

假设您是大型工业产品的商人,您销售以下两种类型的产品:

压碎机:一种消耗东西的东西,也就是说,你可以把你想要扔掉的东西扔进去。

你们的客户主要对汽车感兴趣,有些对自行车特别感兴趣。这是一种普遍的智慧,那就是:

-|车辆|-^||是|-|自行车|。

你的客户约翰想买一家汽车厂。他不在乎生产什么车,你给他提供自行车厂,他很高兴,因为自行车厂就是汽车厂。这只是一种特殊的,没关系。

反过来说,这是行不通的!如果约翰想要一家自行车厂,而你却交付了一家汽车厂,他会生气的,因为人们无法控制它生产的是哪种随机类型的汽车。

每一家自行车厂都是一家整车厂。(但并不是每一家车辆厂都是自行车厂。)。

-^^||是||-|自行车||自行车工厂|。。

现在,你的下一位顾客,简,想从你那里买一台自行车破碎机。你没有现货,所以你提供了一个通用的车辆破碎机,这是完全可以的。

反过来说,这是行不通的!如果简想要一台汽车粉碎机,而你却送来了一台自行车粉碎机,她会生气的。

每个车辆压路机都是自行车压路机。(但并不是每一家自行车压路机都是车辆压路机。)。

-^|是|是||是||v-|自行车||自行车粉碎|。。

产生的东西(在编程中:返回有问题的对象的函数)与对象(车辆/自行车)的类显示出协变性。

消费事物(在编程中:以有问题的对象为参数的函数)表现出与对象(车辆/自行车)的类别相反的情况。

下面的示例是用科特林编写的,但同样的逻辑也适用于许多其他语言。

接口车辆接口Bike:Vehicle//协方差接口VehicleFactory{Fun Production():Vehicle}接口BikeFactory:VehicleFactory{Override Fun Production():Bike}//ContraVariance接口BikeCrusher{Fun Consumer(Bike:Bike)}接口VehicleCrusher:BikeCrusher{Fun Consumer(VehicleFactory)}Fun John(Factory:VehicleFactory){Val ome Vehicle=factory.Production()}Fun Jane(粉碎机:BikeCrusher){Val SomeBike:Bike=...。Crusher.Consumer(某单车)}Val某VehicleFactory:VehicleFactory=...。Val某个自行车工厂:自行车工厂=...。瓦尔某车辆破碎机:车辆破碎机=...。Val SomeBikeCrusher:BikeCrusher=...john(someVehicleFactory)john(someBikeFactory)jane(someVehicleCrusher)jane(someBikeCrusher)