基於C 的介面基礎教程之五 3

2021-03-31 08:56:59 字數 2202 閱讀 8484

2、繼承介面實現

介面具有不變性,但這並不意味著介面不再發展。類似於類的繼承性,介面也可以繼承和發展。

注意:介面繼承和類繼承不同,首先,類繼承不僅是說明繼承,而且也是實現繼承;而介面繼承只是說明繼承。也就是說,派生類可以繼承基類的方法實現,而派生的介面只繼承了父介面的成員方法說明,而沒有繼承父介面的實現,其次,c#中類繼承只允許單繼承,但是介面繼承允許多繼承,乙個子介面可以有多個父介面。

介面可以從零或多個介面中繼承。從多個介面中繼承時,用":"後跟被繼承的介面名字,多個介面名之間用","分割。被繼承的介面應該是可以訪問得到的,比如從private 型別或internal 型別的介面中繼承就是不允許的。介面不允許直接或間接地從自身繼承。和類的繼承相似,介面的繼承也形成介面之間的層次結構。

請看下面的例子:

using system ;

inte***ce icontrol

inte***ce itextbox: icontrol

inte***ce ilistbox: icontrol

inte***ce i***bobox: itextbox, ilistbox

對乙個介面的繼承也就繼承了介面的所有成員,上面的例子中介面itextbox和ilistbox都從介面icontrol中繼承,也就繼承了介面icontrol的paint方法。介面i***bobox從介面itextbox和ilistbox中繼承,因此它應該繼承了介面itextbox的settext方法和ilistbox的setitems方法,還有icontrol的paint方法。

乙個類繼承了所有被它的基本類提供的介面實現程式。

不通過顯式的實現乙個介面,乙個派生類不能用任何方法改變它從它的基本類繼承的介面對映。例如,在宣告中

inte***ce icontrol

class control: icontrol

} class textbox: control

} textbox 中的方法paint 隱藏了control中的方法paint ,但是沒有改變從control.paint 到icontrol.paint 的對映,而通過類例項和介面例項呼叫paint將會有下面的影響

control c = new control( ) ;

textbox t = new textbox( ) ;

icontrol ic = c ;

icontrol it = t ;

c.paint( ) ; // 影響control.paint( ) ;

t.paint( ) ; // 影響textbox.paint( ) ;

ic.paint( ) ; // 影響control.paint( ) ;

it.paint( ) ; // 影響control.paint( ) ;

但是,當乙個介面方法被對映到乙個類中的虛擬方法,派生類就不可能覆蓋這個虛擬方法並且改變介面的實現函式。例如,把上面的宣告重新寫為

inte***ce icontrol

class control: icontrol

} class textbox: control

} 就會看到下面的結果:

control c = new control( ) ;

textbox t = new textbox( ) ;

icontrol ic = c ;

icontrol it = t ;

c.paint( ) ; // 影響control.paint( );

t.paint( ) ; // 影響textbox.paint( );

ic.paint( ) ; // 影響control.paint( );

it.paint( ) ; // 影響textbox.paint( );

由於顯式介面成員實現程式不能被宣告為虛擬的,就不可能覆蓋乙個顯式介面成員實現程式。乙個顯式介面成員實現程式呼叫另外乙個方法是有效的,而另外的那個方法可以被宣告為虛擬的以便讓派生類可以覆蓋它。例如:

inte***ce icontrol

class control: icontrol

protected virtual void paintcontrol( )

} class textbox: control

} 這裡,從control 繼承的類可以通過覆蓋方法paintcontrol 來對icontrol.paint 的實現程式進行特殊化。

基於C 的介面基礎教程之五

usingsystem inte ceicloneable inte ceicomparable classlistentry icloneable,icomparable inticomparable.compareto objectother classshape icloneable inti...

基於C 的介面基礎教程之五 2

使用顯式介面成員執行體通常有兩個目的 1 因為顯式介面成員執行體不能通過類的例項進行訪問,這就可以從公有介面中把介面的實現部分單獨分離開。如果乙個類只在內部使用該介面,而類的使用者不會直接使用到該介面,這種顯式介面成員執行體就可以起到作用。2 顯式介面成員執行體避免了介面成員之間因為同名而發生混淆。...

基於C 的介面基礎教程之五 6

在進行介面對映時,還要注意下面兩點 1 在決定由類中的哪個成員來實現介面成員時,類中顯式說明的介面成員比其它成員優先實現。2 使用private protected和static修飾符的成員不能參與實現介面對映。例如 inte ce icloneable class c icloneable pub...