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

原创 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:记录也是一种学习.

 

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

相关文章推荐

C#委托中的协变与逆变

1、签名:返回值类型和参数。     2、委托调用要求委托的签名必须与调用的方法的签名匹配,如果签名不匹配,将无法通过编译器的类型检查。     3、协变:允许所调用方法的返回类型可以是委托的返回类型...

Scala 数据类型的协变、逆变、上边界、下边界

先说说协变和逆变(实际上还有非变)。协变和逆变主要是用来解决参数化类型的泛化问题。由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢...

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

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

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

1. 前言之前几篇博文,有些地方涉及到了协变性、逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明。2. 定义这里讨论的协变、逆变与不变都是编...
  • yi_Afly
  • yi_Afly
  • 2016年07月30日 17:38
  • 628

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

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

第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记

第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记 本讲主要讲解Scala中List的构造时的类型约束背后的运行机制 一,List的::和:::详解 二,List中的逆...
  • slq1023
  • slq1023
  • 2015年08月09日 23:26
  • 310

使用泛型实现类型转化-使用通配符上限下限区分协变和逆变采取不同的转化方式

泛型作用:  泛型可以用于三种场景:  1、简单的限定参数类型;  2、用于类型转化的参数限定,即通配符类型上限和下限,因为在转化的时候,子类转父类是协转,是自动的,父类转子类是逆转,需要编写代码手动...
  • bestcxx
  • bestcxx
  • 2017年07月26日 07:30
  • 182

在Scala中,为什么函数的参数类型是逆变的,而函数的返回值协变的

在Scala中,为什么函数的参数类型是逆变的,而函数的返回值协变的概念一首先,需要明确一点的就是Liskov替换原则。以一段java代码为例,如果一个方法的参数它的类型是C,那么在调用这个方法的时候,...

scala类型系统:协变与逆变

协变和逆变主要是用来解决参数化类型的泛化问题。由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢?Java中这种情况下是不可泛化的,...

Programming In Scala笔记-第十九章、类型参数,协变逆变,上界下界

本章主要讲Scala中的类型参数化。本章主要分成三个部分,第一部分实现一个函数式队列的数据结构,第二部分实现该结构的内部细节,最后一个部分解释其中的关键知识点。接下来的实例中将该函数式队列命名为Que...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:委托类型协变和逆变的实际意义
举报原因:
原因补充:

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