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

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

新聞中心

這里有您想知道的互聯網營銷解決方案
淺談C#中的接口問題

接口的相關陳述

10年積累的成都網站建設、網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有四子王免費網站建設讓你可以放心的選擇與我們合作。

◆ 一個接口定義了一個契約;

◆ 接口可以包容方法、C#屬性、事件、以及索引器;

◆ 在一個接口聲明中,我們可以聲明零個或者多個成員;

◆ 所有接口成員的默認訪問類型都是public;

◆ 如果在接口成員聲明中包括了任何修飾符,那么會產生一個編譯器錯誤;

◆ 與一個非抽象類類似,一個抽象類必須提供接口中所有成員的實現,只要這些成員在這個類的基類中出現過。

接口的理解

1. 面向接口編程利用OO的一個基本性質——多態(tài),相同方法不同表現??梢赃@樣想一下,client編寫自己程序的時候,如果直接面向一個具體類寫程序,那這個程序有個風吹草動的,那client就要受到影響,但如果面向一個接口就不同了,某個具體類變了,只知接口,不知具體類的client就可以完全不動。 都說上層領導比較好當,因為可以干的事通常對老百姓來說是虛的,越虛就越不容易錯。 這個道理在OO中也是適用的。

2. 換個視角看,面向接口編程反映OO的另一個方面——封裝,接口將具體實現封裝了起來,可以不影響客戶的情況下切換實現

3. 接口的作用,一言以蔽之,就是標志類的類別(type of class)。把不同類型的類歸于不同的接口,可以更好的管理他們。OO的精髓,我以為,是對對象的抽象,最能體現這一點的就是接口。為什么我們討論設計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似調侃,實乃至理)。

空接口的使用

在接口使用的時候,空接口有2種情況:

1. 類似于ObjectBuilder中的IBuilderPolicy,他們往往是做一個標記,表示需要某個功能.當然你也可以這么用,來表示你的類具有某個功能,實現了你的某個接口。

namespace Microsoft.Practices.ObjectBuilder
{
     /// <summary>
     /// Represents a builder policy interface. Since there are no fixed requirements
     /// for policies, it acts as a marker interface from which to derive all other
     /// policy interfaces.
     /// </summary>
     public interface IBuilderPolicy
     {
     }
}namespace Microsoft.Practices.ObjectBuilder
{
     /// <summary>
     /// Represents a builder policy interface. Since there are no fixed requirements
     /// for policies, it acts as a marker interface from which to derive all other
     /// policy interfaces.
     /// </summary>
     public interface IBuilderPolicy
     {
     }
}

2. 你的接口繼承了別的接口(非空),你的接口本身沒有聲明函數.這種情況一般是你不希望用戶使用父接口作為參數類型,因為他們的用途可能不同,此時就可以用空接口來實現.

interface Text
{
    string getText();
}
 
interface SqlText : Text
{
      
}

可以看到,Text接口是用于返回一個字符串.而SqlText是一個空接口,它繼承了Text接口.也就是說SqlText也是一種Text.但是我們可以知道,任何一個字符串不一定是Sql字符串,所以此時聲明了一個SqlText接口來用于表名當前的字符串是一個Sql字符串.你的函數可以這樣聲明:

public void doQuery(SqlText sqlText)

而不是這樣:

public void doQuery(Text text)

避免用戶產生歧義的想法,一眼看去,就明白應該傳入一個Sql字符串.

#p#

接口的成員為什么沒有委托

我們都知道C#的接口是可以包含事件的,其實當我們看到事件的時候,很容易就會想到委托,委托是事件的基礎,如果對委托和事件不是特別清楚的程序員就一定不會明白,為什么C#接口中可以包含事件而不能有委托呢。其實簡單的說法就是委托也是類型,delegate關鍵字引入的是一個新的類型,所以一個C#接口無法包容一個委托并把它當作成員;而event關鍵字引入的是一個新的成員,因此事件可以歸人接口。理解這點,我們要從C#接口的使命說起,C#接口是一個契約,規(guī)范了接口實現者的行為,而不是要有些什么。很簡單,例如“黨員”是個接口,它肯定有個動作是“為人民服務”,“某某黨員”實現了“黨員” 這個接口,那么“某某黨員”肯定也要“為人民服務”,至于你“某某黨員”是否必須擁用“電腦”、“小孩”。那么“黨員”這個接口中肯定不會有規(guī)定。這也就 是接口的目的,規(guī)范了實現者的一些行為。所以C#接口的成員都是方法,不會有其它了。稍有c#常識的程序員都明白,c#中的屬性,其實就是兩個方法,一個Set方法,一個Get方法,同樣事件和索引器也都是方法,請看下面的接口:

public interface IDrawingObject
    {
        event EventHandler OnDraw;
        string Name
        {
            get;
            set;
        }
        int this[int index]
        {
            get;
            set;
        }
        void SetValue();
    }

該接口包含了c#接口所能接納的所有成員,事件,屬性,索引器,方法。把該接口編譯后,我們用MSIL Disassembler工具查看一下:

這下大家都明白了,其實屬性Name對應于Get_Name(),Set_Name()這兩個方法,事件OnDraw對應于add_OnDraw(),remove_OnDraw()這兩個方法,索引器對應于get_Item(),set_Item()這兩個方法。在看下面的委托和類的定義:

public delegate void TestEventDelegate(object sender, System.EventArgs e);
class TestClass
    {
        public void SetValue()
        { }
}

看到了吧,定義一個委托和定義一個類是沒有什么區(qū)別的,都是定義了個新的類型。所以C#接口是不能有委托的,除非微軟告訴我們C#接口中是可以定義類的。


網頁標題:淺談C#中的接口問題
分享地址:http://m.5511xx.com/article/dhdssdj.html