198彩票官网

    欢迎访问北大青鸟鲁广校区~

  1. 加入收藏
  2. 设为主页
  3. 学校简介

三分钟了解北大青鸟

×

北大青鸟C#技术之关于接口的相关陈述

责任编辑:027hpedu来源:北大青鸟鲁广校区ACCP课程发布时间:2013-04-21 16:29
导读:北大青鸟C#技术中关于接口的相关陈述,请阅读文了解详情。
   北大青鸟C#技术中关于接口的相关陈述,请阅读文了解详情。
    ◆ 一个接口定义了一个契约;

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

    ◆ 在一个接口声明中,我们可以声明零个或者多个成员;

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

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

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

    接口的理解

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

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

    3. 接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(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
     {
     }
}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工具查看一下:
北大青鸟武汉宏鹏C#技术

    这下大家都明白了,其实属性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#接口是不能有委托的,除非微软告诉我们C#接口中是可以定义类的。
    了解更多关于北大青鸟C#技术请继续关注武汉北大青鸟官网。

本文标题:北大青鸟C#技术之关于接口的相关陈述,责任编辑:027hpedu,来源:北大青鸟武汉宏鹏鲁广校,于2013年04月21日16时29分发布于北大青鸟鲁广校区。武汉北大青鸟宏鹏鲁广校区,是北大青鸟武汉电脑学校,专业IT计算机培训,拥有软件/网络/安卓/Web前端/Java课程.北大青鸟地址:光谷广场鲁巷数码港.电话:027-87807717

专业老师指导

赵老师

198彩票官网从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业。

培训咨询客服

刘老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑。

本文地址:
文章标题:
×
在线咨询更多问题

如您有任何疑问
在线咨询随时为您解答或拨打咨询热线:17740513250

×
  • 姓 名*
  • 手 机*
  • QQ号/微信号
  • 所报学科 *
  • 其他备注
  • 温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。

爱拼彩票充值 爱尚彩票充值 宝赢彩票充值 159彩票 百万彩票充值 106彩票 爱拼彩票充值 159彩票 内蒙古快3走势图 内蒙古快3走势图