接口中可以有虚方法:浅谈C#中的接口问题

  接口相关陈述

  ◆ 个接口定义了个契约;

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

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

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

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

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

  接口理解

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

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

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

  空接口使用

  在接口使用时候,空接口有2种情况:

  1. 类似于ObjectBuilder中IBuilderPolicy,他们往往是做个标记,表示需要某个功能.当然你也可以这么用,来表示你类具有某个功能,实现了你某个接口

Microsoft.Practices.ObjectBuilder
{
   /// <summary>
   /// Represents a builder policy erface. Since there are no fixed requirements
   /// for policies, it acts as a marker erface from which to derive all other
   /// policy erfaces.
   /// </summary>
   public erface IBuilderPolicy
   {
   }
} Microsoft.Practices.ObjectBuilder
{
   /// <summary>
   /// Represents a builder policy erface. Since there are no fixed requirements
   /// for policies, it acts as a marker erface from which to derive all other
   /// policy erfaces.
   /// </summary>
   public erface IBuilderPolicy
   {
   }
}
  2. 你接口继承了别接口(非空),你接口本身没有声明.这种情况般是你不希望用户使用父接口作为参数类型,他们用途可能区别,此时就可以用空接口来实现.

erface Text
{
getText;
}
erface 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 erface IDrawingObject
{
event EventHandler _disibledevent=>

  这下大家都明白了其实属性Name对应于Get_Name,Set_Name这两个思路方法事件OnDraw对应于add_OnDraw,remove_OnDraw这两个思路方法索引器对应于get_Item,_Item这两个思路方法在看下面委托和类定义:

public delegate void TestEventDelegate(object sender, .EventArgs e);
TestClass
{
public void SetValue
{ }
}




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



Tags:  接口中可以有虚方法

延伸阅读

最新评论

发表评论