明確實作介面成員
更新:2007 年 11 月
介面是用來支援某個功能的合約;實作介面的類別必須為此介面中指定的成員提供實作的細節。例如,IEnumerator 介面可定義必須實作才能支援一組物件 (例如集合) 上之列舉的成員簽章。若要實作 IEnumerator,類別必須實作 Current、MoveNext 和 Reset 成員。
當類別明確實作介面成員時,此成員只能透過介面的參考來加以存取;這樣會隱藏介面成員。明確實作介面成員的一個常見理由不僅要遵守介面的合約,也要以某個方法來改善它 (例如,為了提供應該用來取代介面的弱式型別方法的強型別方法)。另一個明確實作介面成員的常見理由是發生在開發人員不應該呼叫明確介面成員時。例如,GetObjectData 成員最常是明確實作的成員,因為它會由序列化基礎結構所呼叫,且不是要從程式碼呼叫。
下列設計方針可協助您確保程式庫設計只有在適當的時機才會使用明確介面實作。
如果沒有強力的理由,要避免明確實作介面成員。
瞭解明確實作需要有進階級的專業知識。例如,許多開發人員並不知道明確實作的成員是可以公開呼叫的,即使它的簽章為私用時亦然。因此,明確實作的成員不會出現在公開可見成員的清單中;明確實作成員也可能會產生不必要的實值型別 Boxing。
如果成員只要透過介面來呼叫,請考慮明確實作介面成員。
這個主要包括可支援 .NET Framework 基礎結構的成員,例如,資料繫結或序列化。例如,IsReadOnly 屬性只能由資料繫結的基礎結構透過 ICollection<T> 介面的參考來加以存取。List<T> 類別可明確實作這個屬性,因為它有符合這個方針。
請考慮明確實作介面成員來模擬變異數 (也就是變更被覆寫的成員中的參數或傳回型別)。
通常這項處理是用來提供介面成員的強型別版本。
請考慮明確實作介面成員來隱藏成員,並加入具有更好的名稱的對等成員。
如此可有效地將成員重新命名;例如,Stream 會明確地實作 Dispose 並在它的地方提供 Close 方法。
不要將明確成員當做安全性界限來使用。
明確實作成員並不會提供任何安全性,可利用介面的參考來公開呼叫這些成員。
要提供受保護的虛擬成員,此成員可提供與明確實作的成員相同的功能,但前提是這個功能是要由衍生類別所特製化。
明確實作的成員無法被覆寫;如果這些成員在衍生類別中重新定義,此衍生類別將無法呼叫基底類別實作。在命名受保護的成員時,您應該使用與明確介面成員相同的名稱,或是將 Core 附於介面成員名稱。
Portions Copyright 2005 Microsoft Corporation.All rights reserved.
Portions Copyright Addison-Wesley Corporation.All rights reserved.
如需設計方針的詳細資訊,請參閱由 Krzysztof Cwalina 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。