狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當(dāng)前位置:系統(tǒng)之家 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

基于C#的接口基礎(chǔ)圖文詳細(xì)教程之4

基于C#的接口基礎(chǔ)圖文詳細(xì)教程之4

更新時(shí)間:2019-09-24 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

  第四節(jié)、訪問(wèn)接口

  對(duì)接口成員的訪問(wèn)

  對(duì)接口方法的調(diào)用和采用索引指示器訪問(wèn)的規(guī)則與類(lèi)中的情況也是相同的。如果底層成員的命名與繼承而來(lái)的高層成員一致,那么底層成員將覆蓋同名的高層成員。但由于接口支持多繼承,在多繼承中,如果兩個(gè)父接口含有同名的成員,這就產(chǎn)生了二義性(這也正是C#中取消了類(lèi)的多繼承機(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) ; 錯(cuò)誤, Count 有二義性
   //rs.Count = 1; 錯(cuò)誤, Count 有二義性
   ((ISequence)rs).Count = 1; // 正確
   ((IRing)rs).Count(1) ; // 正確調(diào)用IRing.Count
  }
}

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

  再看下面的例子:

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) ; 錯(cuò)誤
  Num.Add(1.0) ; // 正確
  ((IInteger)n).Add(1) ; // 正確
  ((IDouble)n).Add(1) ; // 正確
 }
}

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

  接口的多重繼承的問(wèn)題也會(huì)帶來(lái)成員訪問(wèn)上的問(wèn)題。例如:

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覆蓋了。所以對(duì)d. FWay (1)的調(diào)用實(shí)際上調(diào)用了。雖然從IBase-> IRight-> IDerived這條繼承路徑上來(lái)看,ILeft.FWay方法是沒(méi)有被覆蓋的。我們只要記住這一點(diǎn):一旦成員被覆蓋以后,所有對(duì)其的訪問(wèn)都被覆蓋以后的成員"攔截"了。

  類(lèi)對(duì)接口的實(shí)現(xiàn)

  前面我們已經(jīng)說(shuō)過(guò),接口定義不包括方法的實(shí)現(xiàn)部分。接口可以通過(guò)類(lèi)或結(jié)構(gòu)來(lái)實(shí)現(xiàn)。我們主要講述通過(guò)類(lèi)來(lái)實(shí)現(xiàn)接口。用類(lèi)來(lái)實(shí)現(xiàn)接口時(shí),接口的名稱(chēng)必須包含在類(lèi)定義中的基類(lèi)列表中。

  下面的例子給出了由類(lèi)來(lái)實(shí)現(xiàn)接口的例子。其中ISequence 為一個(gè)隊(duì)列接口,提供了向隊(duì)列尾部添加對(duì)象的成員方法Add( ),IRing 為一個(gè)循環(huán)表接口,提供了向環(huán)中插入對(duì)象的方法Insert(object obj),方法返回插入的位置。類(lèi)RingSquence 實(shí)現(xiàn)了接口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) {…}
}

  如果類(lèi)實(shí)現(xiàn)了某個(gè)接口,類(lèi)也隱式地繼承了該接口的所有父接口,不管這些父接口有沒(méi)有在類(lèi)定義的基類(lèi)表中列出。看下面的例子:

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

  這里, 接口IcomboBox繼承了ItextBox和IlistBox。類(lèi)TextBox不僅實(shí)現(xiàn)了接口ITextBox,還實(shí)現(xiàn)了接口ITextBox 的父接口IControl。

  前面我們已經(jīng)看到,一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。再看下面的例子:

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

  類(lèi)EditBox從類(lèi)Control中派生并且實(shí)現(xiàn)了Icontrol和IdataBound。在前面的例子中接口Icontrol中的Paint方法和IdataBound接口中的Bind方法都用類(lèi)EditBox中的公共成員實(shí)現(xiàn)。C#提供一種實(shí)現(xiàn)這些方法的可選擇的途徑,這樣可以使執(zhí)行這些的類(lèi)避免把這些成員設(shè)定為公共的。接口成員可以用有效的名稱(chēng)來(lái)實(shí)現(xiàn)。例如,類(lèi)EditBox可以改作方法Icontrol.Paint和IdataBound.Bind來(lái)來(lái)實(shí)現(xiàn)。

public class EditBox: IControl, IDataBound {
 void IControl.Paint( ) {...}
 void IDataBound.Bind(Binder b) {...}
}

  因?yàn)橥ㄟ^(guò)外部指派接口成員實(shí)現(xiàn)了每個(gè)成員,所以用這種方法實(shí)現(xiàn)的成員稱(chēng)為外部接口成員。外部接口成員可以只是通過(guò)接口來(lái)調(diào)用。例如,Paint方法中EditBox的實(shí)現(xiàn)可以只是通過(guò)創(chuàng)建Icontrol接口來(lái)調(diào)用。

class Test {
 static void Main( ) {
  EditBox editbox = new EditBox( );
  editbox.Paint( ); //錯(cuò)誤: EditBox 沒(méi)有Paint 事件
  IControl control = editbox;
  control.Paint( ); // 調(diào)用 EditBox的Paint事件
 }
}

  上例中,類(lèi)EditBox 從Control 類(lèi)繼承并同時(shí)實(shí)現(xiàn)了IControl and IDataBound 接口。EditBox 中的Paint 方法來(lái)自IControl 接口,Bind 方法來(lái)自IDataBound 接口,二者在EditBox 類(lèi)中都作為公有成員實(shí)現(xiàn)。當(dāng)然,在C# 中我們也可以選擇不作為公有成員實(shí)現(xiàn)接口。

  如果每個(gè)成員都明顯地指出了被實(shí)現(xiàn)的接口,通過(guò)這種途徑被實(shí)現(xiàn)的接口我們稱(chēng)之為顯式接口成員(explicit interface member)。 用這種方式我們改寫(xiě)上面的例子:

public class EditBox: IControl, IDataBound {
 void IControl.Paint( ) {…}
 void IDataBound.Bind(Binder b) {…}
}

  顯式接口成員只能通過(guò)接口調(diào)用。例如:

class CTest {
 static void Main( ) {
  EditBox editbox = new EditBox( ) ;
  editbox.Paint( ) ; //錯(cuò)誤:不同的方法
  IControl control = editbox;
  control.Paint( ) ; //調(diào)用 EditBox的Paint方法
 }
}

  上述代碼中對(duì)editbox.Paint( )的調(diào)用是錯(cuò)誤的,因?yàn)閑ditbox 本身并沒(méi)有提供這一方法。control.Paint( )是正確的調(diào)用方式。

  注釋?zhuān)航涌诒旧聿惶峁┧x的成員的實(shí)現(xiàn),它僅僅說(shuō)明這些成員,這些成員必須依靠實(shí)現(xiàn)接口的類(lèi)或其它接口的支持。

  知道了怎樣訪問(wèn)接口,我們還要知道怎樣實(shí)現(xiàn)接口,要實(shí)現(xiàn)C#的接口,請(qǐng)看下一節(jié)-實(shí)現(xiàn)接口

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
一区二区av| 国模 一区 二区 三区| 日韩一区二区三区免费看| 国产99久久久久| 国产精品青草综合久久久久99| 欧美国产三级| 中文字幕亚洲精品在线观看 | 中文字幕一区免费在线观看 | 午夜一区不卡| www.欧美精品一二区| 亚洲区小说区图片区qvod| 欧美人狂配大交3d怪物一区| 欧美婷婷久久| 懂色av一区二区三区蜜臀| 亚洲精品成人天堂一二三| 欧美精品日日鲁夜夜添| 国产在线视频欧美一区二区三区| 亚洲先锋成人| 成人黄色国产精品网站大全在线免费观看| av一区二区三区| 国产丝袜美腿一区二区三区| 国产精品人人爽人人做我的可爱| 国产精品一区三区| 日本三级韩国三级欧美三级| 亚洲欧美日韩精品久久久久| 国产精品porn| 一片黄亚洲嫩模| 国产无人区一区二区三区| 欧美一级一区二区| 欧美日韩国产大片| 欧美日韩国产经典色站一区二区三区| 国产精品女主播一区二区三区| 一色屋精品视频在线看| 欧美一区二区三区免费看| 国产成人一级电影| 成人福利电影精品一区二区在线观看| 国产一区二区电影| 色综合天天性综合| 一本大道久久精品懂色aⅴ| 日韩三区在线观看| 国产精品国产三级国产aⅴ无密码| 亚洲免费观看高清完整版在线| 亚洲欧美另类小说视频| 三级久久三级久久| 美女视频黄 久久| 美女视频第一区二区三区免费观看网站 | 欧美日韩免费电影| 欧美xxxxx裸体时装秀| 国产精品免费av| 日韩美女啊v在线免费观看| 无码av免费一区二区三区试看| 久久99久久99小草精品免视看| 成人美女视频在线看| aa日韩免费精品视频一| 色婷婷香蕉在线一区二区| 欧美一区二区免费观在线| 国产人成亚洲第一网站在线播放 | 在线视频欧美精品| www日韩大片| 五月天一区二区三区| 色综合中文字幕国产 | 国产精品国产三级国产aⅴ入口 | 亚洲日韩视频| 欧美一区二区三区四区五区| 久久婷婷国产综合国色天香| 久久众筹精品私拍模特| 日产欧产美韩系列久久99| 亚洲二区三区四区| 欧美本精品男人aⅴ天堂| 日韩精品电影一区亚洲| 国产精品www.| 欧美成人三级在线| 美女网站色91| 亚洲毛片网站| 国产婷婷色一区二区三区四区| 久久99最新地址| 西西人体一区二区| 国产日韩欧美精品电影三级在线| 丝袜诱惑亚洲看片| 亚洲一区三区在线观看| 久久一日本道色综合| 国产一区中文字幕| 欧美老人xxxx18| 日产国产欧美视频一区精品| 欧美久久综合| 久久精品一区二区三区av| 国产在线国偷精品产拍免费yy| 免费视频久久| 亚洲va欧美va人人爽| 国产亚洲一级| 亚洲va天堂va国产va久| 亚洲专区一区二区三区| 国产成人99久久亚洲综合精品| 18成人免费观看视频| 国产欧美综合在线| 亚洲图片在线观看| 亚洲激情一二三区| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区三区久久久| 狂野欧美一区| 久久精品国产第一区二区三区| 欧美午夜精品一区二区三区| 国产高清久久久久| 久久综合九色综合欧美亚洲| 成人福利视频网站| 国产精品久久毛片a| 在线看无码的免费网站| 一区二区三区日韩欧美| 91久久免费观看| 99久久综合国产精品| 日本不卡的三区四区五区| 日韩精品在线看片z| 一区二区不卡在线视频 午夜欧美不卡'| 日本中文字幕一区二区视频| 337p粉嫩大胆噜噜噜噜噜91av | 美女视频免费一区| 在线电影院国产精品| 久久天天做天天爱综合色| 99久久99久久精品免费观看| 久久亚洲精品国产精品紫薇| 欧美亚洲国产一区二区三区va| 国内精品久久久久久久97牛牛| 精品一区二区三区免费| 亚洲免费在线看| 日韩欧美中文字幕精品| 久久久久国产精品一区二区| 99视频精品全部免费在线| 亚洲成a人片在线不卡一二三区 | 欧美一区永久视频免费观看| 亚洲午夜精品久久久久久浪潮 | 成人激情视频网站| 日韩成人精品在线观看| 国产精品私人自拍| 欧美成人在线直播| 欧美三级在线看| 亚洲影院一区| 国内自拍亚洲| 高清不卡在线观看| 午夜欧美一区二区三区在线播放| 欧美mv日韩mv| 777精品伊人久久久久大香线蕉| 亚洲一区精彩视频| 亚洲精品极品| 国产精品v欧美精品v日本精品动漫| 国产精品自拍毛片| 精品一区二区久久久| 五月婷婷综合激情| 一区二区三区成人| 中文文精品字幕一区二区| 欧美国产激情一区二区三区蜜月| 日本一区二区在线不卡| 国产视频一区在线观看| 精品国产乱码久久久久久夜甘婷婷 | 韩日在线一区| 97久久超碰精品国产| 国产乱人伦偷精品视频免下载| 久久精精品视频| 久久黄色网页| 欧洲一区二区三区免费视频| 欧美综合77777色婷婷| 夜夜嗨一区二区| 国产日韩精品一区观看| 91久久精品www人人做人人爽| 激情久久五月| 国产亚洲综合精品| 久久久久久亚洲精品不卡4k岛国| 狂野欧美一区| 日韩一区二区电影在线| 国产亚洲短视频| 伊人婷婷欧美激情| 日韩综合在线视频| 国模套图日韩精品一区二区| 成人午夜精品一区二区三区| 成人av影视在线观看| 狠狠色综合网站久久久久久久| 亚洲精品四区| 久热这里只精品99re8久| 制服.丝袜.亚洲.中文.综合| 欧美精品一区二区三区视频| 中文字幕一区二区在线播放| 无码av中文一区二区三区桃花岛| 国产夫妻精品视频| 韩国一区二区三区在线观看 | 成人三级伦理片| 一区二区三区欧美成人| 欧美日韩国产综合久久| 久久久99久久精品欧美| 亚洲国产精品久久艾草纯爱| 老司机精品视频线观看86 | 国产精品毛片| 久久久精品综合| 久久精品国产免费| 欧美久久影院| 91精品中文字幕一区二区三区| 国产精品视频免费看| 日韩高清一区在线| 国产精品99一区二区| 8x福利精品第一导航| 亚洲一区欧美一区| 91免费在线看|