`
hehailin1986_163.com
  • 浏览: 151072 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C#中的接口

    博客分类:
  • .Net
阅读更多

引自:http://www.cnblogs.com/sifang2004/archive/2006/07/14/450565.html

 

 

接口的描述:

 

1.一个接口定义了一个契约。

2.接口可以包容方法、C#属性、事件、以及索引器

3.在一个接口声明中,我们可以声明零个或者多个成员。

4.所有接口成员的默认访问类型都是public

5.如果在接口成员声明中包括了任何修饰符,那么会产生一个编译器错误。

6.与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基类中出现过。

 

 

接口的成员为什么没有委托?

 

我们都知道C#的接口是可以包含事件的,其实当我们看到事件的时候,很容易就会想到委托,委托是事件的基础,如果对委托和事件不是特别清楚的程序员就一定不会明白,为什么C#接口中可以包含事件而不能有委托呢。其实简单的说法就是委托也是类型,delegate关键字引入的是一个新的类型,所以一个C#接口无法包容一个委托并把它当作成员;而event关键字引入的是一个新的成员,因此事件可以归人接口。理解这点,我们要从C#接口的使命说起,C#接口是一个契约,规范了接口实现者的行为,而不是要有些什么。很简单,例如“党员”是个接口,它肯定有个动作是“为人民服务”,“某某党员”实现了“党员”这个接口,那么“某某党员”肯定也要“为人民服务”,至于你“某某党员”是否必须拥用“电脑”、“小孩”。那么“党员”这个接口中肯定不会有规定。这也就是接口的目的,规范了实现者的一些行为。所以C#接口的成员都是方法,不会有其它了。稍有c#常识的程序员都明白,c#中的属性,其实就是两个方法,一个Set方法,一个Get方法,同样事件和索引器也都是方法,请看下面的接口:

public interface IDrawingObject

    {

        event EventHandler OnDraw;

        string Name

        {

            get;

            set;

        }

        int this[int index]

        {

            get;

            set;

        }

        void SetValue();

    }

该接口包含了c#接口所能接纳的所有成员,事件,属性,索引器,方法.

MSIL Disassembler工具查看一下:

 

属性Name对应于Get_Name(),Set_Name()这两个方法,事件OnDraw对应于add_OnDraw(),remove_OnDraw()这两个方法,索引器对应于get_Item(),set_Item()这两个方法。

 

在看下面的委托和类的定义:

public delegate void TestEventDelegate(object sender, System.EventArgs e);

class TestClass

    {

        public void SetValue()

        { }

}



定义一个委托和定义一个类是没有什么区别的,都是定义了个新的类型。所以
C#接口是不能有委托的,除非微软告诉我们C#接口中是可以定义类的。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics