學(xué)習(xí)C#接口編程——C#接口映射
類必須為在基類表中列出的所有接口的成員提供具體的實現(xiàn)。在類中定位C#接口成員的實現(xiàn)稱之為接口映射(interface mapping )。
映射,數(shù)學(xué)上表示一一對應(yīng)的函數(shù)關(guān)系。C#接口映射的含義也是一樣,接口通過類來實現(xiàn),那么對于在接口中定義的每一個成員,都應(yīng)該對應(yīng)著類的一個成員來為它提供具體的實現(xiàn)。
類的成員及其C#接口映射成員之間必須滿足下列條件:
· 如果A和B都是成員方法,那么A和B的名稱、類型、形參表(包括參數(shù)個數(shù)和每一個參數(shù)的類型)都應(yīng)該是一致的。
· 如果A和B都是屬性,那么A和B的名稱、類型應(yīng)當(dāng)一致,而且A和B的訪問器也是類似的。但如果A不是顯式接口成員執(zhí)行體,A允許增加自己的訪問器。
· 如果A和B都是時間那么A和B的名稱、類型應(yīng)當(dāng)一致。
· 如果A和B都是索引指示器,那么A和B的類型、形參表(包括參數(shù)個數(shù)和每一個參數(shù)的類型)應(yīng)當(dāng)一致。而且A和B的訪問器也是類似的。但如果A不是顯式接口成員執(zhí)行體,A允許增加自己的訪問器。
那么,對于一個接口成員,怎樣確定由哪一個類的成員來實現(xiàn)呢?即一個接口成員映射的是哪一個類的成員?在這里,我們敘述一下接口映射的過程。假設(shè)類C實現(xiàn)了一個接口IInterface,Member是接口IInterface中的一個成員,在定位由誰來實現(xiàn)接口成員Member,即Member的映射過程是這樣的:
1、如果C中存在著一個顯式接口成員執(zhí)行體,該執(zhí)行體與接口IInterface 及其成員Member相對應(yīng),則由它來實現(xiàn)Member 成員。
2、如果條件(1)不滿足,且C中存在著一個非靜態(tài)的公有成員,該成員與接口成員Member相對應(yīng),則由它來實現(xiàn)Member 成員。
3、如果上述條件仍不滿足,則在類C定義的基類列表中尋找一個C 的基類D,用D來代替C。
4、重復(fù)步驟1-3 ,遍歷C的所有直接基類和非直接基類,直到找到一個滿足條件的類的成員。
5、如果仍然沒有找到,則報告錯誤。
下面是一個調(diào)用基類方法來實現(xiàn)接口成員的例子。類Class2 實現(xiàn)了接口Interface1,類Class2 的基類Class1 的成員也參與了接口的映射,也就是說類Class2 在對接口Interface1進行實現(xiàn)時,使用了類Class1提供的成員方法F來實現(xiàn)接口Interface1的成員方法F:
注意:接口的成員包括它自己定義的成員,而且包括該接口所有父接口定義的成員。在接口映射時,不僅要對接口定義體中顯式定義的所有成員進行映射,而且要對隱式地從父接口那里繼承來的所有接口成員進行映射。
在進行C#接口映射時,還要注意下面兩點:
· 在決定由類中的哪個成員來實現(xiàn)接口成員時,類中顯式說明的接口成員比其它成員優(yōu)先實現(xiàn)。
· 使用Private、protected和static修飾符的成員不能參與實現(xiàn)接口映射。例如:
例子中成員ICloneable.Clone稱為接口ICloneable的成員Clone的實現(xiàn)者,因為它是顯式說明的接口成員,比其它成員有著更高的優(yōu)先權(quán)。
如果一個類實現(xiàn)了兩個或兩個以上名字、類型和參數(shù)類型都相同的接口,那么類中的一個成員就可能實現(xiàn)所有這些接口成員:
這里,接口IControl和IForm的方法Paint都映射到了類Page中的Paint方法。當(dāng)然也可以分別用顯式的接口成員分別實現(xiàn)這兩個方法:
上面的兩種寫法都是正確的。但是如果接口成員在繼承中覆蓋了父接口的成員,那么對該接口成員的實現(xiàn)就可能必須映射到顯式接口成員執(zhí)行體。看下面的例子:
接口IDerived從接口IBase中繼承,這時接口IDerived的成員方法覆蓋了父接口的成員方法。因為這時存在著同名的兩個接口成員,那么對這兩個接口成員的實現(xiàn)如果不采用顯式接口成員執(zhí)行體,編譯器將無法分辨接口映射。所以,如果某個類要實現(xiàn)接口IDerived,在類中必須至少定義一個顯式接口成員執(zhí)行體。采用下面這些寫法都是合理的:
另一種情況是,如果一個類實現(xiàn)了多個接口,這些接口又擁有同一個父接口,這個父接口只允許被實現(xiàn)一次。
上面的例子中,類ComboBox實現(xiàn)了三個接口:IControl,ITextBox和IListBox。如果認為ComboBox不僅實現(xiàn)了IControl接口,而且在實現(xiàn)ITextBox和IListBox的同時,又分別實現(xiàn)了它們的父接口IControl。實際上,對接口ITextBox 和IListBox 的實現(xiàn),分享了對接口IControl 的實現(xiàn)。
現(xiàn)在,我們對C#接口映射有了較全面的認識。
【編輯推薦】