委托类型协变和逆变的实际意义

原创 2012年03月30日 16:31:25

设一个委托 TypeA1 DelegateDefine(TypeB1 b)和实际调用的委托方法

TypeA2 DelegateInstance(TypeB2 b)
{
}
根据面向对象继承使用的原则,DelegateInstance要赋给DelegateDefine委托变量,供调用者调用,对于委托而言,相当于公共的规范,返回类型是TypeA,那么你实际返回类型就必须是TypeA或者TypeA的子类,也就是说,对于委托返回类型而言,实际的委托方法的返回类型必须是其子类,即TypeA2必须是TypeA1的子类,这就是所谓的返回类型的协变.而对于委托参数b的TypeB1类型而言,这其实是告诉实际委托方法,我给你的类型是TypeB1,因为是你接收,所以你的实际方法的类型必须是TypeB1本身或者TypeB1的父类,也即TypeB2必须是TypeB1的父类,这就是所谓的委托参数类型的逆变(有的称为抗变).大家知道,委托其实相当于一种接口,或者叫标准,作为标准当然是适用范围越大越好.从上面的解析我们可以知道,要适用范围越大越好,那么定义委托的时候返回类型在类层次中应该越高越好,而参数类型应该越低越好。因为这样可以使得更多的方法可以提供给委托调用。

从委托方角度来看,其实就是要求定义标准时,对外提供的内容类型应该是具体越好(委托定义中的in参数其实就是委托方给受托方的内容类型),这样可以使得更多的受托方法可以参与,而本身接受的内容类型(返回类型和out参数)越抽象越好,因为本身接受的内容类型是受托方给委托方的,类型越抽象,受托方就有更大的参与余地。

 

PS:记录也是一种学习.

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Scala教程(十五)Scala的特性逆变与协变

covariant 协变: 使你能够使用比原始指定的类型的子类,如:C[+T]:如果A是B的子类,那么C[A]是C[B]的子类。 contravariance 逆变: 使你能够使用比原始指定的类型的父...
  • yuan_xw
  • yuan_xw
  • 2015年10月27日 23:26
  • 540

Scala入门到精通——第二十一节 类型参数(三)-协变与逆变

本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} 。当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[...
  • lovehuangjiaju
  • lovehuangjiaju
  • 2015年08月09日 16:14
  • 10735

Java中的逆变与协变

转载自:http://blog.csdn.net/z69183787/article/details/51598345 看下面一段代码: // public final class Integ...
  • zero__007
  • zero__007
  • 2016年08月18日 22:25
  • 3321

再谈对协变和逆变的理解

去年写过一篇博客谈了下我自己对协变和逆变的理解,现在回头看发现当时还是太过“肤浅”,根本没理解。不久前还写过一篇“黑”Java泛型的博客,猛一回头又是“肤浅”,今天学习Java泛型的时候又看到了协变和...
  • z69183787
  • z69183787
  • 2016年06月06日 21:22
  • 2254

scala 中协变与逆变

到上次为止由羽生田先生介绍了Scala语法的特点,这一讲我作为嘉宾来介绍一下Scala的类型系统和相关功能。本次介绍的重点是Java与 Scala之间类层次的差异、范型的协变与逆变、实存类型(Exis...
  • pzw_0612
  • pzw_0612
  • 2015年08月09日 16:57
  • 1304

c# 逆变 协变的理解

c# 逆变 协变的理解
  • qq_26054303
  • qq_26054303
  • 2015年06月16日 14:54
  • 420

Java语言中的协变和逆变

协变和逆变指的是宽类型和窄类型在某种情况下的替换或交换的特性。 协变就是用一个窄类型替代宽类型 逆变则用宽类型覆盖窄类型。...
  • u014717036
  • u014717036
  • 2016年08月17日 21:07
  • 1258

型变的理解,逆变与协变

什么是型变型变在scala中灵活的分为了不变,逆变和协变 * 协变是可以用自己替换需要自己父亲的位置而是允许的,也就是当参数需要父类型参数时你可以传入子类型 * 逆变就是可以用父亲替换儿子的位...
  • cjuexuan
  • cjuexuan
  • 2016年01月21日 10:24
  • 1107

泛型类型的转换,协变和逆变

协变(Convariant)和逆变(Contravariant)的出现,使数组、委托、泛型类型的隐式转换变得可能。 子类转换成基类,称之为协变;基类转换成子类,称之为逆变。.NET4.0以来,支持了泛...
  • lee576
  • lee576
  • 2014年07月17日 22:50
  • 2485

协变、逆变与不变:数组、泛型、与返回类型

1. 前言之前几篇博文,有些地方涉及到了协变性、逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明。2. 定义这里讨论的协变、逆变与不变都是编...
  • yi_Afly
  • yi_Afly
  • 2016年07月30日 17:38
  • 810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:委托类型协变和逆变的实际意义
举报原因:
原因补充:

(最多只允许输入30个字)