基于C#的接口基礎教程之四
2007/1/8 22:46:52
第四節、訪問接口
 
    對接口成員的訪問
 
    對接口方法的調用和采用索引指示器訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那么底層成員將覆蓋同名的高層成員。但由于接口支持多繼承,在多繼承中,如果兩個父接口含有同名的成員,這就產生了二義性(這也正是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(1) ; 錯誤, Count 有二義性
     //rs.Count = 1; 錯誤, Count 有二義性
     ((ISequence)rs).Count = 1; // 正確
     ((IRing)rs).Count(1) ; // 正確調用IRing.Count
    }
  }
 
    上面的例子中,前兩條語句rs .Count(1)和rs .Count = 1會產生二義性,從而導致編譯時錯誤,因此必須顯式地給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(1) ; 錯誤
    Num.Add(1.0) ; // 正確
    ((IInteger)n).Add(1) ; // 正確
    ((IDouble)n).Add(1) ; // 正確
   }
  }
 
    調用Num.Add(1) 會導致二義性,因為候選的重載方法的參數類型均適用。但是,調用Num.Add(1.0) 是允許的,因為1.0 是浮點數參數類型與方法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 (1) ; // 調用ILeft. FWay
    ((IBase)d). FWay (1) ; // 調用IBase. FWay
    ((ILeft)d). FWay (1) ; // 調用ILeft. FWay
    ((IRight)d). FWay (1) ; // 調用IBase. FWay
   }
  }
 
    上例中,方法IBase.FWay在派生的接口ILeft中被Ileft的成員方法FWay覆蓋了。所以對d. FWay (1)的調用實際上調用了。雖然從IBase-> IRight-> IDerived這條繼承路徑上來看,ILeft.FWay方法是沒有被覆蓋的。我們只要記住這一點:一旦成員被覆蓋以后,所有對其的訪問都被覆蓋以后的成員"攔截"了。
  類對接口的實現
 
    前面我們已經說過,接口定義不包括方法的實現部分。接口可以通過類或結構來實現。我們主要講述通過類來實現接口。用類來實現接口時,接口的名稱必須包含在類定義中的基類列表中。
 
    下面的例子給出了由類來實現接口的例子。其中ISequence 為一個隊列接口,提供了向隊列尾部添加對象的成員方法Add( ),IRing 為一個循環表接口,提供了向環中插入對象的方法Insert(object obj),方法返回插入的位置。類RingSquence 實現了接口ISequence 和接口IRing。
 
  using System ;
  interface ISequence {
   object Add( ) ;
  }
  interface ISequence {
   object Add( ) ;
  }
 

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 免费看的黄网站| 四库影院永久在线精品| qvod小说区图片区亚洲| 日韩欧国产精品一区综合无码| 国产91精品新入口| 99精品国产高清自在线看超| 欧洲美女与动性zozozo| 啦啦啦手机完整免费高清观看| 久久久精品久久久久三级| 国精产品一品二品国精品69xx| 一级成人a毛片免费播放| 欧美国产综合欧美视频| 亚洲色欲久久久综合网东京热 | 加勒比黑人在线| 野花高清在线观看免费完整版中文 | 自慰系列无码专区| 成人性开放大片| 亚洲成人福利在线| 黄页网址大全免费观看35| 国产精品成人亚洲| 一男n女高h后宫| 最近中文字幕2018高清在线| 精品久久久久久亚洲中文字幕| 国产精华av午夜在线观看| 一男一女的一级毛片| 无码人妻精品一区二区| 亚洲国产精品成人AV在线| 美女大胸又爽又黄网站| 国产激情视频在线观看首页| 337p日本欧洲亚洲大胆精品555588 | 欧美黑人巨大xxxxx视频| 国产亚洲午夜高清国产拍精品| 91蝌蚪在线播放| 成年片人免费www| 亚洲s色大片在线观看| 精品人妻中文字幕有码在线| 国产一区二区三精品久久久无广告| 高清无码视频直接看| 国产日韩中文字幕| 亚洲最大成人网色香蕉| 国产精品欧美福利久久|