委托中的协变和逆变(C# 编程指南)

本文介绍了委托中的协变和逆变概念,并通过实例展示了如何使用这两种特性来提高代码的灵活性。协变允许方法返回的类型是委托指定类型的派生类型;逆变则允许方法接受的参数类型为委托参数类型的基类型。

将方法签名与委托类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。

一、协变
本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。由 SecondHandler 返回的数据类型是 Dogs 类型,它是由委托中定义的 Mammals 类型派生的。 


  
class Mammals
{
}

class Dogs : Mammals
{
}

class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();

public static Mammals FirstHandler()
{
return null ;
}

public static Dogs SecondHandler()
{
return null ;
}

static void Main()
{
HandlerMethod handler1
= FirstHandler;

// Covariance allows this delegate.
HandlerMethod handler2 = SecondHandler;
}
}

二、逆变

本示例演示如何将委托与具有某个类型的参数的方法一起使用,这些参数是委托签名参数类型的基类型。通过逆变,以前必须使用若干个不同处理程序的地方现在只要使用一个事件处理程序即可
。如,现在可以创建一个接收 EventArgs 输入参数的事件处理程序,然后,可以将该处理程序与发送 MouseEventArgs 类型(作为参数)的 Button.MouseClick 事件一起使用,也可以将该处理程序与发送 KeyEventArgs 参数的 TextBox.KeyDown 事件一起使用。


  
System.DateTime lastActivity;
public Form1()
{
InitializeComponent();

lastActivity
= new System.DateTime();
this .textBox1.KeyDown += this .MultiHandler; // works with KeyEventArgs
this .button1.MouseClick += this .MultiHandler; // works with MouseEventArgs

}

// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler( object sender, System.EventArgs e)
{
lastActivity
= System.DateTime.Now;
}

源于:MSDN

转载于:https://www.cnblogs.com/08shiyan/archive/2011/05/13/2045526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值