狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美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视频
一区二区三区电影在线播| 狂野欧美性猛交xxxx巴西| 中文国产一区| 欧美日韩国产首页在线观看| 欧美激情一二三区| 午夜欧美在线一二页| 国产高清成人在线| 国产欧美精品| 精品国产伦一区二区三区观看方式| 日韩一区日韩二区| 国产乱码一区二区三区| 99re66热这里只有精品4| 欧美精品丝袜中出| 亚洲一区二区不卡免费| 波多野结衣中文字幕一区| 久久成人在线| 中文字幕av一区二区三区免费看| 久久99久久精品欧美| 欧美日韩在线观看一区二区三区| 欧美三日本三级三级在线播放| 国产精品美女久久久久久久| 看国产成人h片视频| 亚洲另类自拍| 国产亚洲成年网址在线观看| 精品一区二区三区在线观看国产| 日韩午夜在线电影| 久久久久久免费网| 国产精品一级片在线观看| 欧美一进一出视频| 中文字幕一区二区三区蜜月 | 色噜噜久久综合| 国产精品久久久久久久久搜平片| 国产黑丝在线一区二区三区| 在线一区二区视频| 一区二区三国产精华液| 欧美午夜免费| 久久亚洲一级片| 国产精品一线二线三线精华| 久久久精品动漫| 亚洲激情男女视频| 伊人成人在线视频| 中文av字幕一区| 色综合天天综合| 精品盗摄一区二区三区| 国产精品538一区二区在线| 日本韩国一区二区| 日韩一区精品字幕| 米奇777在线欧美播放| 依依成人综合视频| 狠狠久久婷婷| 亚洲欧洲精品一区二区三区不卡| 91麻豆国产香蕉久久精品| 日韩欧美国产一区二区在线播放| 黄色日韩三级电影| 制服丝袜亚洲精品中文字幕| 韩国精品在线观看| 欧美精品xxxxbbbb| 国产精品538一区二区在线| 777亚洲妇女| 国产激情偷乱视频一区二区三区| 欧美一区二区免费观在线| 国产美女娇喘av呻吟久久| 欧美一区二区在线免费观看| 国产剧情一区在线| 欧美sm美女调教| 97se狠狠狠综合亚洲狠狠| 久久久国际精品| 国内综合精品午夜久久资源| 亚洲欧洲另类国产综合| 国产日本精品| 日本成人在线看| 欧美精品777| 成人sese在线| 国产精品视频一区二区三区不卡| 激情久久五月| 亚洲成人精品一区| 欧美色倩网站大全免费| 国产高清精品久久久久| 久久久国际精品| 亚洲全部视频| 日韩成人av影视| 欧美一区二区三区啪啪| 99久久久国产精品免费蜜臀| 日韩一区在线免费观看| 色呦呦国产精品| 国产.精品.日韩.另类.中文.在线.播放| 精品999久久久| 在线观看一区视频| 日韩精品一二三四| 91精品国产一区二区三区 | 一区二区三区四区在线播放| 久久一区免费| 国产91丝袜在线播放0| 欧美国产乱子伦| 美女网站久久| 福利电影一区二区| 亚洲免费观看高清在线观看| 欧美在线不卡视频| 91视频你懂的| 午夜天堂影视香蕉久久| 日韩欧美一区二区免费| 国产一区二区无遮挡| 男人的天堂久久精品| 久久亚洲一区二区三区四区| 国产精品久久久对白| 国产一区二区在线免费观看| 国产精品美女一区二区三区| 91福利精品视频| 91麻豆国产香蕉久久精品| 亚洲mv大片欧洲mv大片精品| 久久一区二区三区四区| 久久综合伊人77777麻豆| av亚洲精华国产精华精| 亚洲一区二区三区精品在线| 欧美成人免费网站| 噜噜噜噜噜久久久久久91| 99久久精品免费看国产免费软件| 亚洲国产wwwccc36天堂| 久久免费美女视频| 在线视频欧美区| 激情久久久久久久| 国产伦精品一区二区三区在线观看| 亚洲人成精品久久久久久| 日韩色在线观看| 老牛国产精品一区的观看方式| 欧美1区视频| 精品一区二区三区影院在线午夜| 亚洲美女免费在线| 久久久久国产精品人| 欧美日韩视频在线观看一区二区三区| 国产在线精品一区二区中文| 懂色av中文字幕一区二区三区| 亚洲国产视频一区| 国产精品日韩成人| 日韩亚洲国产中文字幕欧美| 久久久久久久欧美精品| 亚洲国产午夜| 欧美激情视频一区二区三区在线播放 | 在线成人亚洲| 91视频在线观看免费| 国产精品一品视频| 麻豆一区二区在线| 亚洲国产精品久久不卡毛片| 国产精品久久久久久久蜜臀| 精品国产三级电影在线观看| 欧美性一级生活| 久久久久网站| 香蕉久久国产| 亚洲第一黄色| 亚洲午夜精品久久久久久浪潮 | 亚洲欧美日韩成人高清在线一区| 久久亚洲综合色一区二区三区| 欧美色图12p| 欧美在线你懂得| 老司机亚洲精品| 另类国产ts人妖高潮视频| 99精品福利视频| 日韩五码在线| 国产精品免费一区二区三区观看| 亚洲国产精选| 亚洲乱码久久| 亚洲一区免费看| 久久高清一区| 色婷婷av一区二区三区gif| 国产精品夜夜夜| 国产日韩欧美在线播放不卡| 国产日韩一区二区三区在线| 国产欧美日韩综合一区在线播放| 亚洲黄色高清| 午夜亚洲精品| 久久人人97超碰人人澡爱香蕉| 国产精品免费一区二区三区在线观看| 9国产精品视频| 裸体素人女欧美日韩| 一本久久综合亚洲鲁鲁五月天 | 欧美成人日韩| 黄色一区二区三区四区| 在线观看一区视频| 国产精品日韩一区二区| 免费亚洲电影| 欧美日韩综合在线| 欧美一区二区三区公司| 26uuu欧美| 国产精品嫩草影院av蜜臀| 亚洲精品一二三区| 亚洲国产美女搞黄色| 免费国产亚洲视频| 国产高清久久久久| 牛牛国产精品| 国产亚洲精品久久飘花| 日本乱人伦aⅴ精品| 日韩欧美中文字幕精品| 国产日产欧美一区二区视频| 亚洲免费观看高清完整| 秋霞午夜鲁丝一区二区老狼| 国产精品自拍一区| 欧美成人日本| 久热这里只精品99re8久| 欧美一区二区高清| 中文字幕一区二区三区四区|