知识大全 基于C#的接口基础教程之四

Posted

篇首语:知不足而奋进,望远山而力行。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于C#的接口基础教程之四相关的知识,希望对你有一定的参考价值。

基于C#的接口基础教程之四  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  第四节 访问接口

  对接口成员的访问

  对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的 如果底层成员的命名与继承而来的高层成员一致 那么底层成员将覆蓋同名的高层成员 但由于接口支持多继承 在多继承中 如果两个父接口含有同名的成员 这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一) 这时需要进行显式的定义

  using System ;  interface ISequence      int Count get; set;     interface IRing      void Count(int i) ;    interface IRingSequence: ISequence IRing   class CTest      void Test(IRingSequence rs)        //rs Count( ) ; 错误 Count 有二义性    //rs Count = ; 错误 Count 有二义性    ((ISequence)rs) Count = ; // 正确    ((IRing)rs) Count( ) ; // 正确调用IRing Count     

  上面的例子中 前两条语句rs Count( )和rs Count = 会产生二义性 从而导致编译时错误 因此必须显式地给rs 指派父接口类型 这种指派在运行时不会带来额外的开销

  再看下面的例子

  using System ;  interface IInteger      void Add(int i) ;    interface IDouble      void Add(double d) ;    interface INumber: IInteger IDouble   class CMyTest      void Test(INumber Num)        // Num Add( ) ; 错误    Num Add( ) ; // 正确    ((IInteger)n) Add( ) ; // 正确    ((IDouble)n) Add( ) ; // 正确     

  调用Num Add( ) 会导致二义性 因为候选的重载方法的参数类型均适用 但是 调用Num Add( ) 是允许的 因为 是浮点数参数类型与方法IInteger Add()的参数类型不一致 这时只有IDouble Add 才是适用的 不过只要加入了显式的指派 就决不会产生二义性

  接口的多重继承的问题也会带来成员访问上的问题 例如

  interface IBase      void FWay(int i) ;    interface ILeft: IBase      new void FWay (int i) ;    interface IRight: IBase void G( ) ;   interface IDerived: ILeft IRight   class CTest      void Test(IDerived d)        d FWay ( ) ; // 调用ILeft FWay    ((IBase)d) FWay ( ) ; // 调用IBase FWay    ((ILeft)d) FWay ( ) ; // 调用ILeft FWay    ((IRight)d) FWay ( ) ; // 调用IBase FWay     

  上例中 方法IBase FWay在派生的接口ILeft中被Ileft的成员方法FWay覆蓋了 所以对d FWay ( )的调用实际上调用了 虽然从IBase > IRight > IDerived这条继承路径上来看 ILeft FWay方法是没有被覆蓋的 我们只要记住这一点 一旦成员被覆蓋以后 所有对其的访问都被覆蓋以后的成员 拦截 了

  类对接口的实现

  前面我们已经说过 接口定义不包括方法的实现部分 接口可以通过类或结构来实现 我们主要讲述通过类来实现接口 用类来实现接口时 接口的名称必须包含在类定义中的基类列表中

  下面的例子给出了由类来实现接口的例子 其中ISequence 为一个队列接口 提供了向队列尾部添加对象的成员方法Add( ) IRing 为一个循环表接口 提供了向环中插入对象的方法Insert(object obj) 方法返回插入的位置 类RingSquence 实现了接口ISequence 和接口IRing

  using System ;  interface ISequence      object Add( ) ;    interface ISequence      object Add( ) ;    interface IRing      int Insert(object obj) ;    class RingSequence: ISequence IRing     public object Add( ) …   public int Insert(object obj) …  

  如果类实现了某个接口 类也隐式地继承了该接口的所有父接口 不管这些父接口有没有在类定义的基类表中列出 看下面的例子

  using System ;  interface IControl      void Paint( );    interface ITextBox: IControl      void SetText(string text);    interface IListBox: IControl      void SetItems(string[] items);    interface IComboBox: ITextBox IListBox

  这里 接口IboBox继承了ItextBox和IlistBox 类TextBox不仅实现了接口ITextBox 还实现了接口ITextBox 的父接口IControl

  前面我们已经看到 一个类可以实现多个接口 再看下面的例子

  interface IDataBound      void Bind(Binder b);    public class EditBox: Control IControl IDataBound      public void Paint( );   public void Bind(Binder b)   

  类EditBox从类Control中派生并且实现了Icontrol和IdataBound 在前面的例子中接口Icontrol中的Paint方法和IdataBound接口中的Bind方法都用类EditBox中的公共成员实现 C#提供一种实现这些方法的可选择的途径 这样可以使执行这些的类避免把这些成员设定为公共的 接口成员可以用有效的名称来实现 例如 类EditBox可以改作方法Icontrol Paint和IdataBound Bind来来实现

  public class EditBox: IControl IDataBound      void IControl Paint( )    void IDataBound Bind(Binder b)   

  因为通过外部指派接口成员实现了每个成员 所以用这种方法实现的成员称为外部接口成员 外部接口成员可以只是通过接口来调用 例如 Paint方法中EditBox的实现可以只是通过创建Icontrol接口来调用

  class Test      static void Main( )        EditBox editbox = new EditBox( );    editbox Paint( ); //错误: EditBox 没有Paint 事件    IControl control = editbox;    control Paint( ); // 调用 EditBox的Paint事件     

  上例中 类EditBox 从Control 类继承并同时实现了IControl and IDataBound 接口 EditBox 中的Paint 方法来自IControl 接口 Bind 方法来自IDataBound 接口 二者在EditBox 类中都作为公有成员实现 当然 在C# 中我们也可以选择不作为公有成员实现接口

  如果每个成员都明显地指出了被实现的接口 通过这种途径被实现的接口我们称之为显式接口成员(explicit interface member) 用这种方式我们改写上面的例子

  public class EditBox: IControl IDataBound      void IControl Paint( ) …   void IDataBound Bind(Binder b) …  

  显式接口成员只能通过接口调用 例如

  class CTest      static void Main( )        EditBox editbox = new EditBox( ) ;    editbox Paint( ) ; //错误:不同的方法    IControl control = editbox;    control Paint( ) ; //调用 EditBox的Paint方法     

  上述代码中对editbox Paint( )的调用是错误的 因为editbox 本身并没有提供这一方法 control Paint( )是正确的调用方式

  注释 接口本身不提供所定义的成员的实现 它仅仅说明这些成员 这些成员必须依靠实现接口的类或其它接口的支持

cha138/Article/program/net/201311/15729

相关参考

知识大全 基于C#的接口基础教程之三

基于C#的接口基础教程之三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第三节定义接口成员  

知识大全 基于C#的接口基础教程之五

基于C#的接口基础教程之五  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第五节实现接口  显式

知识大全 基于C#的接口基础教程之七

基于C#的接口基础教程之七  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  映射接口  类必须为在

知识大全 基于C#的接口基础教程之二

基于C#的接口基础教程之二  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第二节定义接口  从技

知识大全 基于C#的接口基础教程之一

基于C#的接口基础教程之一  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 C#接口基础知识实例讲解

C#接口基础知识实例讲解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从技术上讲接口是一组包含

知识大全 全面剖析C#接口编程之定义接口

全面剖析C#接口编程之定义接口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从技术上讲接口是一

知识大全 基于Delphi的接口编程入门

基于Delphi的接口编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一为什么使用接口? 

知识大全 深入浅出分析C#接口的作用

深入浅出分析C#接口的作用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#接口的作用  C#

知识大全 C#实现多个接口描述

C#实现多个接口描述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在向大家详细介绍C#实现多个