谈谈C#中的接口

谈谈 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# 接口中是可以定义类的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值