购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 委托示例

C#中提供的回调函数的机制便是委托——一种类型安全的机制。为了直观地了解委托,我们先来看一段代码:

下面我们来看看这段代码的功能。在最开始,我们可以看到internal委托类型MyDelegate的声明。委托要确定一个回调方法签名,包括参数以及返回类型等,在本例中MyDelegate委托制定的回调方法的参数类型是int,返回类型为void。DelegateScript类还定义了两个私有方法PrintNum和DoubleNum,它们分别实现了打印传入的参数和打印传入的参数的两倍的功能。在Start方法中,MyDelegate类的实例myDelegate分别引用了这两个方法,并且分别调用了这两个方法。

在为委托实例引用方法时,C#允许引用类型的协变性和逆变性。协变性是指方法的返回类型可以是从委托的返回类型派生的一个派生类,也就是说协变性描述的是委托返回类型。逆变性则是指方法获取的参数类型可以是委托的参数类型的基类,换言之逆变性描述的是委托的参数类型。

例如,我们的项目中存在的基础单位类(BaseUnitClass)、士兵类(SoldierClass)以及英雄类(HeroClass),其中基础单位类BaseUnitClass作为基类派生出了士兵类SoldierClass和英雄类HeroClass,那么我们可以定义一个委托,就像下面这样:

我们完全可以通过构造一个该委托类型的实例来引用具有以下原型的方法:

在这个例子中,TellMeYourNameMethod方法的参数类型是BaseUnitClass,它是TellMeYourName委托的参数类型SoldierClass的基类,这种参数的逆变性是允许的;而TellMeYourNameMethod方法的返回值类型为string,是派生自TellMeYourName委托的返回值类型Object的,因而这种返回类型的协变性也是允许的。但是有一点需要指出,协变性和逆变性仅仅支持引用类型,所以如果是值类型或void则不支持。下面我们接着举一个例子,如果将TellMeYourNameMethod方法的返回类型改为值类型int,如下:

这个方法除了返回类型从string(引用类型)变成了int(值类型)之外,什么都没有改变,但是如果要将这个方法绑定到上述的委托实例上,编译器会报错。虽然int型和string型一样,都派生自Object类,但是int型是值类型,因而是不支持协变性的。这一点,各位读者在实际的开发中一定要注意。

到此我们应该对委托有了一个初步的直观印象。在本节中我带领大家直观地认识了委托如何在代码中使用,通过C#引入的方法组转换机制为委托实例引用合适的方法,以及委托的协变性和逆变性。接下来让我们更进一步地探索委托。 Qym9rmXUUHv8RBNLpgyvttNsGOz15ZgRwvdRibTeDvC7qSuCul6P8JtN0b/xnqU0

点击中间区域
呼出菜单
上一章
目录
下一章
×