委托和事件(续)
在昨天写的“委托和事件”中我只跟大家分享了怎么用委托和委托的注册与取消注册,可以很多人看了还是不懂,还会有很多疑问。比如为什么声明委托时大多数都用void没有返回值;为什么不直接调用委托而要把委托放在类中在去调用声明的委托事件呢?哪么今天我就来讲讲这些问题,为什么要这样用。
在声明委托时大部分都会用void不接收返回值,但这是为什么呢?因为我们使用有返回值的委托,有多个方法对委托的事件进行了注册时,注册的方法会把前面方法的返回值覆盖掉,更何况声明的委托根本就不关注谁注册了事件,更别说是返回值了,所以一般我们都会使用void。
虽然我们一般不会使用带返回值的委托,但我们还是来看一下他的代码:
public class A
{
public delegate string EntrustDelegate();
public event EntrustDelegate buyEgg;
public voidGetDelegate()
{
if (buyEgg != null)
{
string AB= buyEgg();
Console.WriteLine( AB);
}
}
}
public class B
{
public static string buyEggA()
{
string B="A去买";
return B;
}
public static string buyEggB()
{
string B="B去买";
return B;
}
}
class D
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
a.buyEgg += B.buyEggA;
a.buyEgg += B.buyEggB;
a.GetDelegate();
Console.Read();
}
}
输出结果:
B去买
从输出结果很明显的可以看出A方法的返回值被B方法的返回值覆盖掉了。
而对于为什么不直接调用委托,而要把委托放到类里在去调用委托声明的事件呢;主要是因为从封装性、易用性上去考虑。因为如果不把委托的声明放在类中,客户端就可以对它赋值等操作,这样会严重的破坏对象的封装性;有人可能就会问了,为什么声明时不用Private去声明呢?private是私有啊。因为声明委托的目的就是为了把他暴露在类的客户端进行方法的注册,你把它声明为private了,客户端对它根本就不可见,那它还有什么用?虽然是不能用private去声明委托,但是我们可用event来声明事件啊,因为event声明的事件在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
如写的不对之处,欢迎指正!!!!