使用顯式介面成員執行體通常有兩個目的:
1、因為顯式介面成員執行體不能通過類的例項進行訪問,這就可以從公有介面中把介面的實現部分單獨分離開。如果乙個類只在內部使用該介面,而類的使用者不會直接使用到該介面,這種顯式介面成員執行體就可以起到作用。
2、顯式介面成員執行體避免了介面成員之間因為同名而發生混淆。如果乙個類希望對名稱和返回型別相同的介面成員採用不同的實現方式,這就必須要使用到顯式介面成員執行體。如果沒有顯式介面成員執行體,那麼對於名稱和返回型別不同的介面成員,類也無法進行實現。
下面的定義是無效的,因為shape 定義時基類列表中沒有出現介面i***parable。
class shape: icloneable }
class ellipse: shape }
在ellipse 中定義icloneable.clone是錯誤的,因為ellipse即使隱式地實現了介面icloneable,icloneable仍然沒有顯式地出現在ellipse定義的基類列表中。
介面成員的全權名必須對應在介面中定義的成員。如下面的例子中,paint的顯式介面成員執行體必須寫成icontrol.paint。
using system ;
inte***ce icontrol
inte***ce itextbox: icontrol
class textbox: itextbox
void itextbox.settext(string text)
} 實現介面的類可以顯式實現該介面的成員。當顯式實現某成員時,不能通過類例項訪問該成員,而只能通過該介面的例項訪問該成員。顯式介面實現還允許程式設計師繼承共享相同成員名的兩個介面,並為每個介面成員提供乙個單獨的實現。
下面例子中同時以公制單位和英製單位顯示框的尺寸。box類繼承 ienglishdimensions和 imetricdimensions兩個介面,它們表示不同的度量衡系統。兩個介面有相同的成員名 length 和 width。
程式清單1 demoninte***ce.cs
inte***ce ienglishdimensions
inte***ce imetricdimensions
class box : ienglishdimensions, imetricdimensions
float ienglishdimensions.length( )
float ienglishdimensions.width( )
float imetricdimensions.length( )
float imetricdimensions.width( )
public static void main( ) ", edimensions.length( ));
system.console.writeline(" width (in): ", edimensions.width( ));
system.console.writeline(" length(cm): ", mdimensions.length( ));
system.console.writeline(" width (cm): ", mdimensions.width( ));
} }
輸出:length(in): 30,width (in): 20,length(cm): 76.2,width (cm): 50.8
**討論:如果希望預設度量採用英製單位,請正常實現 length 和 width 這兩個方法,並從 imetricdimensions 介面顯式實現 length 和 width 方法:
public float length( )
public float width( )
float imetricdimensions.length( )
float imetricdimensions.width( )
這種情況下,可以從類例項訪問英製單位,而從介面例項訪問公制單位:
system.console.writeline("length(in): ", mybox.length( )) ;
system.console.writeline("width (in): ", mybox.width( )) ;
system.console.writeline("length(cm): ", mdimensions.length( )) ;
system.console.writeline("width (cm): ", mdimensions.width( )) ;
基於C 的介面基礎教程之五
usingsystem inte ceicloneable inte ceicomparable classlistentry icloneable,icomparable inticomparable.compareto objectother classshape icloneable inti...
基於C 的介面基礎教程之五 3
2 繼承介面實現 介面具有不變性,但這並不意味著介面不再發展。類似於類的繼承性,介面也可以繼承和發展。注意 介面繼承和類繼承不同,首先,類繼承不僅是說明繼承,而且也是實現繼承 而介面繼承只是說明繼承。也就是說,派生類可以繼承基類的方法實現,而派生的介面只繼承了父介面的成員方法說明,而沒有繼承父介面的...
基於C 的介面基礎教程之五 6
在進行介面對映時,還要注意下面兩點 1 在決定由類中的哪個成員來實現介面成員時,類中顯式說明的介面成員比其它成員優先實現。2 使用private protected和static修飾符的成員不能參與實現介面對映。例如 inte ce icloneable class c icloneable pub...