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