溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中怎么訪問接口成員

發(fā)布時(shí)間:2021-07-20 11:11:24 來源:億速云 閱讀:158 作者:Leah 欄目:編程語言

C#中怎么訪問接口成員,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

C#對接口成員訪問

C#對接口方法的調(diào)用和采用索引指示器訪問的規(guī)則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那么底層成員將覆蓋同名的高層成員。但由于接口支持多繼承,在多繼承中,如果兩個父接口含有同名的成員,這就產(chǎn)生了二義性(這也正是C#中取消了類的多繼承機(jī)制的原因之一),這時(shí)需要進(jìn)行顯式的定義:

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) ; // 正確調(diào)用IRing.Count  }  }

上面的例子中,前兩條語句rs .Count(1)和rs .Count = 1會產(chǎn)生二義性,從而導(dǎo)致編譯時(shí)錯誤,因此必須顯式地給rs 指派父接口類型,這種指派在運(yùn)行時(shí)不會帶來額外的開銷。

再看下面的例子:

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) ; // 正確  }  }

調(diào)用Num.Add(1) 會導(dǎo)致二義性,因?yàn)楹蜻x的重載方法的參數(shù)類型均適用。但是,調(diào)用Num.Add(1.0) 是允許的,因?yàn)?.0 是浮點(diǎn)數(shù)參數(shù)類型與方法IInteger.Add()的參數(shù)類型不一致,這時(shí)只有IDouble.Add 才是適用的。不過只要加入了顯式的指派,就決不會產(chǎn)生二義性。

接口的多重繼承的問題也會帶來C#對接口成員訪問上的問題。例如:

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) ; // 調(diào)用ILeft. FWay  ((IBase)d). FWay (1) ; // 調(diào)用IBase. FWay  ((ILeft)d). FWay (1) ; // 調(diào)用ILeft. FWay  ((IRight)d). FWay (1) ; // 調(diào)用IBase. FWay  }  }

上例中,方法IBase.FWay在派生的接口ILeft中被Ileft的成員方法FWay覆蓋了。所以對d. FWay (1)的調(diào)用實(shí)際上調(diào)用了。雖然從IBase-> IRight-> IDerived這條繼承路徑上來看,ILeft.FWay方法是沒有被覆蓋的。我們只要記住這一點(diǎn):一旦成員被覆蓋以后,所有對其的訪問都被覆蓋以后的成員"攔截"了。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI