C#接口。 隐式实现与显式实现

在C#中隐式显式实现接口有什么区别?

什么时候应该使用隐式,何时应该使用显式?

这两种方法有没有优点和/或缺点?


微软官方指导(从第一版框架设计指南)指出, 不建议使用显式实现 ,因为它给代码带来了意想不到的行为。

我认为这个指导方针在IoC时代之前是非常有效的 ,当你不把它作为接口传递时。

任何人都可以涉及这方面?


隐含的是当你通过你的类中的成员定义你的接口。 显式是在接口上的类中定义方法的时候。 我知道这听起来令人困惑,但这里是我的意思: IList.CopyTo将隐含实现为:

public void CopyTo(Array array, int index)
{
    throw new NotImplementedException();
}

并明确表示为:

void ICollection.CopyTo(Array array, int index)
{
    throw new NotImplementedException();
}

不同之处在于,隐式地通过您在创建时所创建的类可以访问该类,以及将其作为接口进行投射。 显式实现允许它仅在作为接口本身进行转换时才可访问。

MyClass myClass = new MyClass(); // Declared as concrete class
myclass.CopyTo //invalid with explicit
((IList)myClass).CopyTo //valid with explicit.

我主要使用显式来保持实现清洁,或者当我需要两个实现时。 但无论我很少使用它。

我相信有更多的理由使用它/不使用它,别人会发布。

请参阅本主题中的下一篇文章 ,了解每个背后的优秀推理。


隐式定义只是将接口要求的方法/属性等直接作为公共方法添加到类中。

显式定义强制仅在您直接使用接口而不使用底层实现时暴露成员。 这在大多数情况下是首选。

  • 通过直接使用接口,您不承认,并将您的代码耦合到底层实现。
  • 如果您已经拥有了代码中的公共属性名称,并且想要实现也具有Name属性的接口,那么明确地执行它将使两者分离。 即使他们正在做同样的事情,我仍然会将显式调用委托给Name属性。 你永远不知道,你可能想改变Name对普通类的工作方式,以及Name,接口属性如何工作。
  • 如果你隐式地实现了一个接口,那么你的类现在暴露了新的行为,这些行为可能只与接口的客户端相关,这意味着你不能保证你的类简洁(我的意见)。

  • 除了已经提供的优秀答案之外,还有一些情况需要显式实现,以便编译器能够找出需要的内容。 以IEnumerable<T>为例,它可能会经常出现。

    这是一个例子:

    public abstract class StringList : IEnumerable<string>
    {
        private string[] _list = new string[] {"foo", "bar", "baz"};
    
        // ...
    
        #region IEnumerable<string> Members
        public IEnumerator<string> GetEnumerator()
        {
            foreach (string s in _list)
            { yield return s; }
        }
        #endregion
    
        #region IEnumerable Members
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
        #endregion
    }
    

    在这里, IEnumerable<string>实现IEnumerable ,因此我们也需要。 但是,通用和普通版本都使用相同的方法签名来实现函数 (C#忽略返回类型)。 这是完全合法和罚款。 编译器如何解决使用哪个? 它强制你至多只有一个隐含的定义,然后它可以解决它需要的任何东西。

    即。

    StringList sl = new StringList();
    
    // uses the implicit definition.
    IEnumerator<string> enumerableString = sl.GetEnumerator();
    // same as above, only a little more explicit.
    IEnumerator<string> enumerableString2 = ((IEnumerable<string>)sl).GetEnumerator();
    // returns the same as above, but via the explicit definition
    IEnumerator enumerableStuff = ((IEnumerable)sl).GetEnumerator();
    

    PS:IEnumerable显式定义中的一小部分间接引用是因为在函数内部,编译器知道变量的实际类型是一个StringList,这就是它解析函数调用的方式。 某些.NET核心接口实现某些抽象层似乎已经积累了一些细小的事实。

    链接地址: http://www.djcxy.com/p/8899.html

    上一篇: C# Interfaces. Implicit implementation versus Explicit implementation

    下一篇: Differences between iPhone and iPod Touch