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