This question和Eric Lippert's answer讓我想知道:如何做您決定在實現接口的方法時是使用顯式還是隱式實現?我應該明確還是隱式地實現接口成員?
8
A
回答
8
(個人)當只有具有相同簽名的方法之間發生衝突時,纔會看到需要顯式實現。
例如,執行IEnumerable<T>
時,應執行2個方法GetEnumerator()
,它們具有相同的簽名,但返回類型除外。所以你必須實行IEnumerable.GetEnumerator()
明確:
public abstract class MyClass<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return ...;
}
IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
{
return GetEnumerator();
}
}
另一個使用了一個明確的實現,如果你不想通過對象實例調用的方法,而只能通過一個界面實現。我個人認爲這沒有多大意義,但在一些非常罕見的情況下,它可能是有用的。
3
Philippe的答案是實用的,但是,也有一些建築方面的考慮。
接口用於使類兼容,以便它們可以被其他對象使用。如果只有那些消費對象需要接口的功能,那麼它應該受到限制 - 以最小特權爲原則。如果沒有必要將該接口方法公開給該類的所有其他用戶。
保羅
1
顯式接口的另一種情況是對象需要實現一個接口,以接受來自內部對象的調用,但你不希望公開這些作爲API的一部分。
相關問題
- 1. 如何使用JAVA明確實現接口成員?
- 2. 如何在C++/CLI中顯式/隱式地實現接口成員?
- 3. 不實現接口成員
- 4. 實現接口成員 'System.Collections.IEnumerable.GetEnumerator()'
- 5. 明確地實現了一些接口的方法,並且隱式地實現了一些方法
- 6. 將顯式接口實現重構隱式接口實現
- 7. 如何昂貴的是拳擊明確地實現接口
- 8. Typescript - 爲什麼我應該重寫所有成員來實現一個接口?
- 9. 我應該實現List接口還是擴展Java中的ArrayList類
- 10. 數據庫層成員應該是靜態還是實例?
- 11. 我應該繼承數組還是聲明它是一個成員?
- 12. 什麼是顯式接口成員實現,爲什麼
- 13. 我應該如何正確實現核心Clojure接口?
- 14. 類聲明中的成員接口隱式公開嗎?
- 15. 接口的隱式和顯式實現
- 16. 接口實現:隱式與顯式
- 17. 覆蓋/隱藏明確實現的接口方法
- 18. 明確的接口實現和Reflection.Emit
- 19. 不實現接口成員'System.Icomparable.CompareTo(object)'?
- 20. 「不實現接口成員‘System.ICloneable.Clone()’
- 21. 石英:不實現接口成員
- 22. Nop.Plugin.Payments.Paytm.PaytmPaymentProcessor'不實現接口成員'Nop.Services.Payments.IPaymentMethod.PaymentMethodDescription'
- 23. 「EmployeeDetails」不實現接口成員「System.ComponentModel.INotifyPropertyChanged.PropertyChanged」
- 24. 錯誤:未實現接口成員
- 25. SimpleLucene無法實現接口成員
- 26. 操縱桿不實現接口成員
- 27. 不實現接口成員 - C#
- 28. 不實現接口成員發出
- 29. Shared.CellItem'沒有實現接口成員'System.IDisposable.Dispose()
- 30. 沒有實現接口成員錯誤
你能想到一個可能適用的例子嗎? – jasonh 2009-12-03 19:33:13
Web dev。如果一個類被設計爲在整個Web上提供服務,那麼可能有一些方法可以用於安全接口中的身份驗證,這種安全接口可以在任何其他情況下(本地)使用。這有點了解我認爲經常被忽略的C#特性。其他例子呢? – Paul 2009-12-03 19:47:05