代码改变世界

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

2012-03-30 16:31  java线程例子  阅读(252)  评论(0编辑  收藏  举报

设一个委托 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:记录也是一种学习.