日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#對接口成員訪問分析

在向大家詳細介紹C#對接口成員訪問之前,首先讓大家了解下C#對接口方法的調(diào)用,然后全面介紹C#對接口成員訪問。

在大祥等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,大祥網(wǎng)站建設(shè)費用合理。

C#對接口成員訪問

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

 
 
 
  1. using System ;  
  2. interface ISequence {  
  3. int Count { get; set; }  
  4. }  
  5. interface IRing {  
  6. void Count(int i) ;  
  7. }  
  8. interface IRingSequence: ISequence, IRing { }  
  9. class CTest {  
  10. void Test(IRingSequence rs) {  
  11. //rs.Count(1) ; 錯誤, Count 有二義性  
  12. //rs.Count = 1; 錯誤, Count 有二義性  
  13. ((ISequence)rs).Count = 1; // 正確  
  14. ((IRing)rs).Count(1) ; // 正確調(diào)用IRing.Count  
  15. }  

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

再看下面的例子:

 
 
 
  1. using System ;  
  2. interface IInteger {  
  3. void Add(int i) ;  
  4. }  
  5. interface IDouble {  
  6. void Add(double d) ;  
  7. }  
  8. interface INumber: IInteger, IDouble {}  
  9. class CMyTest {  
  10. void Test(INumber Num) {  
  11.  
  12. // Num.Add(1) ; 錯誤  
  13. Num.Add(1.0) ; // 正確  
  14. ((IInteger)n).Add(1) ; // 正確  
  15. ((IDouble)n).Add(1) ; // 正確  
  16. }  

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

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

 
 
 
  1. interface IBase {  
  2. void FWay(int i) ;  
  3. }  
  4. interface ILeft: IBase {  
  5. new void FWay (int i) ;  
  6. }  
  7. interface IRight: IBase  
  8. { void G( ) ; }  
  9. interface IDerived: ILeft, IRight { }  
  10. class CTest {  
  11. void Test(IDerived d) {  
  12. d. FWay (1) ; // 調(diào)用ILeft. FWay  
  13. ((IBase)d). FWay (1) ; // 調(diào)用IBase. FWay  
  14. ((ILeft)d). FWay (1) ; // 調(diào)用ILeft. FWay  
  15. ((IRight)d). FWay (1) ; // 調(diào)用IBase. FWay  
  16. }  

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


新聞名稱:C#對接口成員訪問分析
新聞來源:http://www.5511xx.com/article/djcjsco.html