首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在设计业务应用程序时如何使用协方差和反向方差?

在设计业务应用程序时如何使用协方差和反向方差?
EN

Stack Overflow用户
提问于 2011-03-11 19:38:48
回答 2查看 2.3K关注 0票数 16

我知道在标准库中使用co-contravariance (例如集合和特性Function),我想知道co-contravariance是如何在“真实世界”业务应用程序的设计中使用的。

EN

回答 2

Stack Overflow用户

发布于 2011-03-11 23:53:00

典型的例子是函数,将Scala接口作为带有单个参数的函数:

代码语言:javascript
复制
trait Function1[-T1, +R]

它是用于参数的反变体( -),对于返回类型是协变( +)。

为什么?

想象一下,您有以下这些类:

代码语言:javascript
复制
class Timelord { ... }
class Doctor extends Timelord { ... }

class Enemy { ... }
class Dalek extends Enemy { ... }

如果您有一个作为参数的Doctor => Enemy函数的方法,那么可以提供一个TimeLord => Enemy实例。它仍将接受Doctor的实例。

所以TimeLord => EnemyDoctor => Enemy的一个子类,因为TimeLordDoctor的超类,在这个参数中是Doctor

同样,当需要返回一些Dalek的函数时,返回Enemy的函数是有效的,因为Dalek是-一个Enemy

所以Doctor => DalekDoctor => Enemy的子类,因为DalekEnemy的子类,它是参数中的协变量

票数 24
EN

Stack Overflow用户

发布于 2011-03-11 23:17:54

基本上,只要您想要同时使用参数多态性 (泛型)和继承,您可能最终都需要申报地点差异 申报地点差异 使用地点差异 (通配符),或者更有可能两者兼备。

多态类型通常是相当高级别的抽象,因此虽然您的域对象可能不需要方差注释,但是您为操作域对象而编写的代码可能需要使用方差注释,至少如果您的域对象是继承层次结构的一部分,这似乎非常频繁。

如果从本质上看一下任何库或框架,就会发现经常使用方差注释。如果您正确地抽象了您的“真实世界”应用程序,那么您可能需要编写大量的库来支持它,而关键业务逻辑的一个小核心很好地与所有的支持基础结构分离。所有这些支持基础设施也可能经常使用方差注释。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5277526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档