全面剖析C 介面程式設計之實現介面 (2)

2021-04-13 09:45:17 字數 4433 閱讀 1351

重新實現介面

我們已經介紹過,派生類可以對基類中已經定義的成員方法進行過載。類似的概念引入到類對介面 的實現中來,叫做介面的重實現(re-implementation)。繼承了介面實現的類可以對介面進行重實現。這個介面要求是在類定義的基類列表中出 現過的。對介面的重實現也必須嚴格地遵守首次實現介面的規則,派生的介面對映不會對為介面的重實現所建立的介面對映產生任何影響。

下面的**給出了介面重實現的例子:

inte***ce icontrol 

class mycontrol: control, icontrol

public void paint( ) {}

}

實際上就是:control把icontrol.paint對映到了 control.icontrol.paint上,但這並不影響在mycontrol中的重實現。在mycontrol中的重實現中, icontrol.paint被對映到mycontrol.paint 之上。

在介面的重實現時,繼承而來的公有成員定義和繼承而來的顯式介面成員的定義參與到介面對映的過程。

using system ;

inte***ce imethods

class base: imethods

void imethods.g( )

public void h( )

public void i( )

}

class derived: base, imethods

void imethods.h( )

}

這裡,介面imethods在derived中的實現把介面方法對映到了derived.f,

base.imethods.g, derived.imethods.h, 還有base.i。前面我們說過,類在實現乙個介面時,同時隱式地實現了該介面的所有父介面。同樣,類在重實現乙個介面時同時,隱式地重實現了該介面的所有父介面。

using system ;

inte***ce ibase

inte***ce iderived: ibase

class c: iderived

void iderived.g( )

}

class d: c, iderived

public void g( )

}

這裡,對iderived的重實現也同樣實現了對ibase的重實現,把ibase.f 對映到了d.f。

對映介面

對映,數學上表示一一對應的函式關係。介面對映的含義也是一樣,介面通過類來實現,那麼對於在介面中定義的每乙個成員,都應該對應著類的乙個成員來為它提供具體的實現。

類的成員及其所對映的介面成員之間必須滿足下列條件:

· 如果a和b都是成員方法,那麼a和b的名稱、型別、形參表(包括引數個數和每乙個引數的型別)都應該是一致的。

· 如果a和b都是屬性,那麼a和b的名稱、型別應當一致,而且a和b的訪問器也是類似的。但如果a不是顯式介面成員執行體,a允許增加自己的訪問器。

· 如果a和b都是時間那麼a和b的名稱、型別應當一致。

· 如果a和b都是索引指示器,那麼a和b的型別、形參表(包括引數個數和每乙個引數的型別)應當一致。而且a和b的訪問器也是類似的。但如果a不是顯式介面成員執行體,a允許增加自己的訪問器。

那麼,對於乙個介面成員,怎樣確定由哪乙個類的成員來實現呢?即乙個介面成員對映的 是哪乙個類的成員?在這裡,我們敘述一下介面對映的過程。假設類c實現了乙個介面iinte***ce,member是介面iinte***ce中的乙個 成員,在定位由誰來實現介面成員member,即member的對映過程是這樣的:

1、如果c中存在著乙個顯式介面成員執行體,該執行體與介面iinte***ce 及其成員member相對應,則由它來實現member 成員。

2、如果條件(1)不滿足,且c中存在著乙個非靜態的公有成員,該成員與介面成員member相對應,則由它來實現member 成員。

3、如果上述條件仍不滿足,則在類c定義的基類列表中尋找乙個c 的基類d,用d來代替c。

4、重複步驟1-3 ,遍歷c的所有直接基類和非直接基類,直到找到乙個滿足條件的類的成員。

5、如果仍然沒有找到,則報告錯誤。

下面是乙個呼叫基類方法來實現介面成員的例子。類class2 實現了介面inte***ce1,類class2 的基類class1 的成員也參與了介面的對映,也就是說類class2 在對介面inte***ce1進行實現時,使用了類class1提供的成員方法f來實現介面inte***ce1的成員方法f:

inte***ce inte***ce1 

class class1

public void g( )

}

class class2: class1, inte***ce1

}

注意:介面的成員包括它自己定義的成員,而且包括該介面所有父介面定義的成員。在介面對映時,不僅要對介面定義體中顯式定義的所有成員進行對映,而且要對隱式地從父介面那裡繼承來的所有介面成員進行對映。

在進行介面對映時,還要注意下面兩點:

· 在決定由類中的哪個成員來實現介面成員時,類中顯式說明的介面成員比其它成員優先實現。

· 使用private、protected和static修飾符的成員不能參與實現介面對映。例如:

inte***ce icloneable 

class c: icloneable

public object clone( )

}

例子中成員icloneable.clone稱為介面icloneable的成員clone的實現者,因為它是顯式說明的介面成員,比其它成員有著更高的優先權。

如果乙個類實現了兩個或兩個以上名字、型別和引數型別都相同的介面,那麼類中的乙個成員就可能實現所有這些介面成員:

inte***ce icontrol 

inte***ce iform

class page: icontrol, iform

}

這裡,介面icontrol和iform的方法paint都對映到了類page中的paint方法。當然也可以分別用顯式的介面成員分別實現這兩個方法:

inte***ce icontrol 

inte***ce iform

class page: icontrol, iform

public void iform.paint( )

}

上面的兩種寫法都是正確的。但是如果介面成員在繼承中覆蓋了父介面的成員,那麼對該介面成員的實現就可能必須對映到顯式介面成員執行體。看下面的例子:

inte***ce ibase 

}

inte***ce iderived: ibase

介面iderived從介面ibase中繼承,這時介面iderived的成員方法 覆蓋了父介面的成員方法。因為這時存在著同名的兩個介面成員,那麼對這兩個介面成員的實現如果不採用顯式介面成員執行體,編譯器將無法分辨介面對映。所 以,如果某個類要實現介面iderived,在類中必須至少定義乙個顯式介面成員執行體。採用下面這些寫法都是合理的:

//一:對兩個介面成員都採用顯式介面成員執行體來實現

lass c: iderived

int iderived.p( )

}

//二:對ibase 的介面成員採用顯式介面成員執行體來實現

class c: iderived

public int p( )

}

//三:對iderived 的介面成員採用顯式介面成員執行體來實現

class c: iderived

int iderived.p( )

}

另一種情況是,如果乙個類實現了多個介面,這些介面又擁有同乙個父介面,這個父介面只允許被實現一次。

using system ;

inte***ce icontrol

inte***ce ilistbox: icontrol

class combobox: icontrol, itextbox, ilistbox

void itextbox.settext(string text)

void ilistbox.setitems(string items)

}

上面的例子中,類combobox實現了三個介面:icontrol, itextbox和ilistbox。如果認為combobox不僅實現了icontrol介面,而且在實現itextbox和ilistbox的同時, 又分別實現了它們的父介面icontrol。實際上,對介面itextbox 和ilistbox 的實現,分享了對介面icontrol 的實現。

全面剖析c 介面程式設計之定義介面

定義介面成員 介面可以包含乙個和多個成員,這些成員可以是方法 屬性 索引指示器和事件,但不能是常量 域 操作符 建構函式或析構函式,而且不能包含任何靜態成員。介面定義建立新的定義空間,並且介面定義直接包含的介面成員定義將新成員引入該定義空間。說明 介面的成員是從基介面繼承的成員和由介面本身定義的成員...

全面剖析C 介面程式設計之覆蓋虛介面

有時候我們需要表達一種抽象的東西,它是一些東西的概括,但我們又不能真正的看到它成為乙個實體在我們眼前出現,為此物件導向的程式語言便有了抽象類的概念。c 作為乙個物件導向的語言,必然也會引入抽象類這一概念。介面和抽象類使您可以建立元件互動的定義。通過介面,可以指定元件必須實現的方法,但不實際指定如何實...

C 程式設計之介面

1.定義 介面是把公共方法和屬性組合起來,以封裝特定功能的乙個集合。一旦定義了介面,就可以在類中實現它。這樣類就可以支援介面所指定的所有屬性和成員 注意1 介面不能單獨存在。不能像例項化乙個類那樣例項化乙個介面。另外介面不能包含實現其成員的任何 只能定義成員本身。實現過程必須在實現介面的類中實現。注...