C#接口成员为什么没有委托
我们都知道C#接口是可以包含事件的,其实当我们看到事件的时候,很容易就会想到委托,委托是事件的基础,如果对委托和事件不是特别清楚的程序员就一定不会明白,为什么C#接口中可以包含事件而不能有委托呢。其实简单的说法就是委托也是类型,delegate关键字引入的是一个新的类型,所以一个C#接口无法包容一个委托并把它当作成员;而event关键字引入的是一个新的成员,因此事件可以归人接口。理解这点,我们要从C#接口的使命说起,C#接口是一个契约,规范了接口实现者的行为,而不是要有些什么。很简单,例如“党员”是个接口,它肯定有个动作是“为人民服务”,“某某党员”实现了“党员” 这个接口,那么“某某党员”肯定也要“为人民服务”,至于你“某某党员”是否必须拥用“电脑”、“小孩”。那么“党员”这个接口中肯定不会有规定。这也就是接口的目的,规范了实现者的一些行为。所以C#接口成员都是方法,不会有其它了。稍有c#常识的程序员都明白,c#中的属性,其实就是两个方法,一个Set方法,一个Get方法,同样事件和索引器也都是方法,请看下面的接口:
- publicinterfaceIDrawingObject
- {
- eventEventHandlerOnDraw;
- stringName
- {
- get;
- set;
- }
- intthis[intindex]
- {
- get;
- set;
- }
- voidSetValue();
- }
该接口包含了C#接口所能接纳的所有成员,事件,属性,索引器,方法。把该接口编译后,我们用MSIL Disassembler工具查看一下:
这下大家都明白了,其实属性Name对应于Get_Name(),Set_Name()这两个方法,事件OnDraw对应于add_OnDraw(),remove_OnDraw()这两个方法,索引器对应于get_Item(),set_Item()这两个方法。在看下面的委托和类的定义:
- publicdelegatevoidTestEventDelegate(objectsender,System.EventArgse);
- classTestClass
- {
- publicvoidSetValue(){
- }
- }
看到了吧,定义一个委托和定义一个类是没有什么区别的,都是定义了个新的类型。所以C#接口是不能有委托的,除非微软告诉我们C#接口中是可以定义类的。以上介绍C#接口成员
【编辑推荐】