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.
我主要使用显式来保持实现清洁,或者当我需要两个实现时。 但无论我很少使用它。
我相信有更多的理由使用它/不使用它,别人会发布。
请参阅本主题中的下一篇文章 ,了解每个背后的优秀推理。
隐式定义只是将接口要求的方法/属性等直接作为公共方法添加到类中。
显式定义强制仅在您直接使用接口而不使用底层实现时暴露成员。 这在大多数情况下是首选。
除了已经提供的优秀答案之外,还有一些情况需要显式实现,以便编译器能够找出需要的内容。 以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