7.1.8 委托中的协变和抗变

来源:互联网 发布:java replace的效率 编辑:程序博客网 时间:2024/05/22 00:04

<c#高级编程>

7.1.8  协变和抗变

委托调用的方法不需要与委托声明定义的类型相同。因此可能出现协变和抗变。

1. 返回类型协变

方法的返回类型可以派生于委托定义的类型。在下面的示例中,委托MyDelegate定义为返回DelegateReturn类型。赋予委托实例d1的方法返回DelegateReturn2类型,DelegateReturn2派生自DelegateReturn,因此满足了委托的需求。这称为返回类型协变。

public class DelegateReturn{}public class DelegateReturn2 : DelegateReturn{}public delegate DelegateReturn MyDelegate1();class Program{static void Main(){MyDelegate1 d1 = Method1;d1();}static DelegateReturn2 Method1(){DelegateReturn2 d2 = new DelegateReturn2();return d2;}} 


 

2. 参数类型抗变

术语"参数类型抗变"表示,委托定义的参数可能不同于委托调用的方法。这里是返回类型不同,因为方法使用的参数类型可能派生自委托定义的类型。在下面的示例代码中,委托使用的参数类型是DelegateParam2,而赋予委托实例d2的方法使用的参数类型是DelegateParam,
DelegateParam是DelegateParam2的基类。

public class DelegateParam{}public class DelegateParam2 : DelegateParam{}
public delegate void MyDelegate2(DelegateParam2 p);
class Program{static void Main(){MyDelegate2 d2 = Method2;DelegateParam2 p = new DelegateParam2();d2(p);}
static void Method2(DelegateParam p){}}


 

原创粉丝点击