【问题标题】:Should I implement interface members explicitly or implicitly?我应该显式还是隐式实现接口成员?
【发布时间】:2009-12-03 18:48:31
【问题描述】:

This questionEric Lippert's answer 让我想知道:在实现接口的方法时,您如何决定是使用显式实现还是隐式实现?

【问题讨论】:

    标签: c#


    【解决方案1】:

    (个人)我认为只有在具有相同签名的方法之间存在冲突时才需要显式实现。

    例如,在实现IEnumerable<T> 时,您应该实现两个签名相同的方法GetEnumerator(),除了返回类型。所以你必须明确地实现IEnumerable.GetEnumerator()

    public abstract class MyClass<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
            return ...;
        }
    
        IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
        {
            return GetEnumerator();
        }
    }
    

    显式实现的另一个用途是,如果您不希望通过对象实例调用方法,而只能通过接口调用。我个人认为这没有多大意义,但在极少数情况下,它可能很有用。

    【讨论】:

      【解决方案2】:

      Philippe 的回答是实用的,但也有架构方面的考虑。

      接口用于使类兼容,以便其他对象可以使用它们。如果只有那些消费对象需要接口的功能,那么它应该被限制 - 由最小特权原则。如果没有必要将该接口方法公开给该类的所有其他用户。

      保罗

      【讨论】:

      • 你能举个例子吗?
      • 网络开发。如果一个类旨在通过 Web 提供服务,则可能有一些方法可以在安全接口中进行身份验证,而这些方法可能不会在其他情况下(本地)使用。这是一个鲜为人知的 C# 功能,我认为它经常被忽略。还有其他例子吗?
      【解决方案3】:

      显式接口的另一种情况是对象需要实现接口以接受来自内部对象的调用,但您不希望将这些作为 API 的一部分公开。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多