Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现隐式和显式接口有意义吗?_C#_Interface_Implicit_Explicit - Fatal编程技术网

C# 实现隐式和显式接口有意义吗?

C# 实现隐式和显式接口有意义吗?,c#,interface,implicit,explicit,C#,Interface,Implicit,Explicit,我目前正在学习MS 70-515考试。在其中一个实践中,作者实现了隐式和显式接口。显式实现只调用隐式实现。这里只列出了显式实现,没有解释 接口的隐式和显式实现都有意义吗?我认为显式实现是多余的(在本例中) 公共类PassTextBox:TextBox,IScriptControl { 公共虚拟IEnumerable GetScriptDescriptors() { var descriptor=新的ScriptControlDescriptor( “AjaxEnabled.PassTextBox

我目前正在学习MS 70-515考试。在其中一个实践中,作者实现了隐式和显式接口。显式实现只调用隐式实现。这里只列出了显式实现,没有解释

接口的隐式和显式实现都有意义吗?我认为显式实现是多余的(在本例中)

公共类PassTextBox:TextBox,IScriptControl
{
公共虚拟IEnumerable GetScriptDescriptors()
{
var descriptor=新的ScriptControlDescriptor(
“AjaxEnabled.PassTextBox”,客户端ID);
// ...
返回新的ScriptDescriptor[]{descriptor};
}
IEnumerable IScriptControl.GetScriptDescriptors()
{
返回GetScriptDescriptors();
}
}
顺便说一句,由于隐式实现是公共的,因此代码在没有显式实现的情况下似乎运行良好


确切地说,它涉及第9章第2课练习3。

明确的实现似乎是完全多余的

我想不出一个方法来称呼它,如果你不考虑它,它会有什么不同


有一个小区别,隐式版本是虚拟的,这意味着它可以被重写。显式版本将始终在此入口点调用。但由于它只调用虚拟成员,所以这里不使用该差异

Marc Gravell实现这两种方法的一个原因可能是非显式方法是
virtual
abstract
,用于子类
重写
。在我的示例中,它确实是虚拟的,但我不明白为什么这也是实现显式接口的原因。我会通过评论他的答案来问Marc他是什么意思。你可以有两个完全不同的实现。但这是否可取?当利用这一点更有意义时,top将实现放在显式中,并让虚拟方法调用它。@Henk:如果虚拟版本将在派生类中重写,并且该类的实例将通过接口变量调用,那么将调用哪个版本?会调用第一个类中的显式版本吗?将执行隐式实现的哪个版本?初始版本还是重写版本?当您通过接口变量调用时,它总是转到显式实现。对象变量(基本或派生)总是隐式的。这些检查的可能重复项总是有一英里长的勘误表。您可以提交自己的:
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();
    }
}