梦想与现实的落差,就是我们离成功的距离!!

博客园 首页 新随笔 联系 订阅 管理
  34 Posts :: 3 Stories :: 372 Comments :: 18 Trackbacks

谈谈C#中的接口

接口的相关陈述

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

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

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

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

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

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

 

接口的理解

1.        面向接口编程利用OO的一个基本性质——多态,相同方法不同表现。可以这样想一下,client编写自己程序的时候,如果直接面向一个具体类写程序,那这个程序有个风吹草动的,那client就要受到影响,但如果面向一个接口就不同了,某个具体类变了,只知接口,不知具体类的client就可以完全不动。 都说上层领导比较好当,因为可以干的事通常对老百姓来说是虚的,越虚就越不容易错。
这个道理在OO中也是适用的。

2.       换个视角看,面向接口编程反映OO的另一个方面——封装,接口将具体实现封装了起来,可以不影响客户的情况下切换实现

3.       接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++javac#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy的名言是抽象就是抽去像的部分,看似调侃,实乃至理)。

 

空接口的使用
在接口使用的时候,空接口有2种情况:
1.
类似于ObjectBuilder中的
IBuilderPolicy,他们往往是做一个标记,表示需要某个功能.当然你也可以这么用,来表示你的类具有某个功能,实现了你的某个接口.

namespace Microsoft.Practices.ObjectBuilder

{

     /// <summary>

     /// Represents a builder policy interface. Since there are no fixed requirements

     /// for policies, it acts as a marker interface from which to derive all other

     /// policy interfaces.

     /// </summary>

     public interface IBuilderPolicy

     {

     }

}

 

2.你的接口继承了别的接口(非空),你的接口本身没有声明函数.这种情况一般是你不希望用户使用父接口作为参数类型,因为他们的用途可能不同,此时就可以用空接口来实现.

 

interface Text

{

    string getText();

}

 

interface SqlText : Text

{

       

}

可以看到,Text接口是用于返回一个字符串.SqlText是一个空接口,它继承了Text接口.也就是说SqlText也是一种Text.但是我们可以知道,任何一个字符串不一定是Sql字符串,所以此时声明了一个SqlText接口来用于表名当前的字符串是一个Sql字符串.你的函数可以这样声明:

public void doQuery(SqlText sqlText)

而不是这样:

public void doQuery(Text text)

避免用户产生歧义的想法,一眼看去,就明白应该传入一个Sql字符串.

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

       我们都知道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#接口中是可以定义类的。

 

posted on 2006-07-14 11:08 叶漂 阅读(7426) 评论(23)  编辑 收藏 网摘 所属分类: 经验小谈

评论

#1楼 2006-07-21 11:18 zzj[未注册用户]
文章不错,头像很差,搞得我页面老刷新.../..

COPY出去看...

  回复  引用    

#2楼 2006-07-21 13:37 leewei      
接口成员为什么没有委托,豁然开朗
  回复  引用  查看    

#3楼 2006-07-22 18:16 MS的明天      
分析的不错,做个笔记。
  回复  引用  查看    

#4楼 2007-08-03 13:40 fazi[未注册用户]
谢谢,很清晰
  回复  引用    

#5楼 2007-08-09 11:24 kke[未注册用户]
还没有看,但应该不错
  回复  引用    

#6楼 2007-12-28 09:23 ffqq[未注册用户]
能不能再谈谈接口的具体使用方法的问题!!

  回复  引用    

写的非常好!

  回复  引用    

照片美女不错~~
  回复  引用    

照片美女是楼主吗?
  回复  引用    

#10楼 2008-06-05 22:01 路人A[未注册用户]
美女,我真的懂了
  回复  引用    

#11楼 2008-06-16 15:53 flylin[未注册用户]
妹妹挺厉害的,就是头像老闪,头都闪晕了!
  回复  引用    

#12楼 2008-07-22 16:28 qsx[未注册用户]
不错,明了了很多
  回复  引用    

不错,对delegate说得很清楚
  回复  引用    

#14楼 2008-08-09 11:14 CQ[未注册用户]
你好,请问你有男朋友吗?
认识一下好不好

  回复  引用    

#15楼 2008-08-19 01:12 7goal[未注册用户]
照片太shine ,无法专心看文章,人比文章好看。。。。
  回复  引用    

以前看到女生写程序总有想笑的冲动,自从看了楼主的文章笑不出口了。
此文的确出自女子之手,是女人的思维方式,聪明的女人的确不一般。

  回复  引用    

我是C++转CSharp的程序员,QQ214704182,如果可以,加我一下。
  回复  引用    

#18楼 2009-01-21 20:24 BlackPhoenix      
汗....
  回复  引用  查看    

写的好啊
  回复  引用  查看    

#20楼 2009-03-15 13:06 WizardWu      
it's right, we can use Interface to define some functionality, it has much more scalability,

we should not write dead code in our system.

http://www.kenming.idv.tw/index.php?blog=5&cat=50&page=1&paged=2" target="_new">http://www.kenming.idv.tw/index.php?blog=5&cat=50&page=1&paged=2



  回复  引用  查看    

这句话:
如果直接面向一个具体类写程序,那这个程序有个风吹草动的,那client就要受到影响,但如果面向一个接口就不同了,某个具体类变了,只知接口,不知具体类的client就可以完全不动。

实在不敢认同。

即时你面向接口就不用改动了吗?面向接口和直接面向类如果变动方法名称或者方法中的参数的话。那需要改动。
如果只是改动方法中的实现,而不改动方法名称和方法的参数。那client用不着改动。

怎么会像你说的那样子呢???

  回复  引用    

好文
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 450565




相关文章:

相关链接: