基於C#的介面基礎教程之四

來源:互聯網
上載者:User

  第四節、提供者

  對介面成員的訪問

  對介面方法的調用和採用索引指標訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將覆蓋同名的高層成員。但由於介面支援多繼承,在多繼承中,如果兩個父介面含有同名的成員,這就產生了二義性(這也正是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
 }
}

共3頁: 上一頁 1 [2][3]下一頁



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。