实现接口时同时使用隐式和显式实现是否有意义?

7

我目前正在为我的MS 70-515考试学习。在练习中,作者实现了一个接口,既有隐式实现,也有显式实现。显式实现只是调用隐式实现。显式实现没有解释,只是简单列出。

在这种情况下,同时拥有隐式和显式实现接口是否有意义?我认为显式实现是多余的。

public class PassTextBox : TextBox, IScriptControl
{
    public virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        var descriptor = new ScriptControlDescriptor(
            "AjaxEnabled.PassTextBox", ClientID);
        // ...
        return new ScriptDescriptor[] {descriptor};
    }

    IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
    {
        return GetScriptDescriptors();
    }
}

顺便提一下,即使没有显式实现,代码似乎也可以正常运行,因为隐式实现是公共的。

它涉及到MCTS自学培训套件(70-515考试):使用Microsoft .NET Framework 4开发Web应用程序第9章,第2课,具体是第3项练习。


可能是隐式和显式接口实现的重复问题。 - M.Babcock
2
这些考试总是有一长串勘误表。您可以提交自己的勘误:http://oreilly.com/catalog/errata.csp?isbn=9780735627406 - Hans Passant
1个回答

10

显式实现似乎完全是多余的。

我想不到有什么方式可以在调用时使其有所区别,即使你省略了它。

只有一个小差异,隐式版本是虚拟的,这意味着它可以被覆盖。 显式版本将始终在此入口点处调用。 但由于它只调用虚拟成员,因此此差异在此处未使用。


Marc Gravell ,实现两者的一个原因可能是_非明确的方法是 virtualabstract,为了子类可以进行override。在我的例子中确实是 virtual,但我不明白为什么这也应该是实现显式接口的原因。我会在他的回答中评论并问Marc他的意思。 - comecme
你可以有两个完全不同的实现。但这是否是可取的?当利用它时,更明智的做法是将实现放在显式位置,并调用虚拟方法。 - H H
@Henk:如果派生类中覆盖了虚拟版本,并且通过接口变量调用该类的实例,那么将调用哪个版本?会调用第一个类中的显式版本吗?哪个隐式实现版本会被执行?初始版本还是覆盖版本? - comecme
1
当您通过接口变量调用时,它总是转到显式实现。对于对象变量(基类或派生类),则总是转到隐式实现。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接