我经常需要在我的代码中实现一些接口,例如IEnumerable<T>
。
每次自动实施时,我都会遇到以下情况:
public IEnumerator<T> GetEnumerator() {
// Code here...
}
public IEnumerator GetEnumerator1() {
// Code here...
}
虽然我必须实现两种GetEnumerator()方法,但它们不可能具有相同的名称,即使我们知道它们也会以某种方式执行相同的操作。编译器不能将它们视为另一个的重载,因为只有返回类型不同。
这样做时,我设法将GetEnumerator1()
访问者设置为private
。这样,编译器不会抱怨没有实现接口成员,我只是在方法体内抛出NotImplementedException
。
然而,我想知道这是一个好习惯,还是我会采取不同的方式,或许是方法别名或类似的东西。
实现
IEnumerable<T>
之类的接口需要实现两个具有相同名称的不同方法时,最好的方法是什么?
编辑#1
VB.NET在实现接口时对C#的反应是否不同,因为在VB.NET中它是明确实现的,因此强制
GetEnumerator1()
。这是代码:
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator
// Code here...
End Function
Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator
// Code here...
End Function
两个GetEnumerator()
方法都是显式实现的,编译将拒绝它们具有相同的名称。为什么呢?
答案 0 :(得分:6)
您可以使用explicit interface implementation:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
...
}
答案 1 :(得分:3)
在Visual Basic中,所有接口实现都是显式的。
接口映射由Implements
语句定义,因此您可以根据需要为接口实现方法命名。 (与C#不同,编译器推断哪些方法通过匹配其名称和签名来实现接口。)
更改方法名称和可见性(视情况而定)是VB中的标准做法。有关概述,请参阅Implementing Interfaces in VB.NET。
答案 2 :(得分:1)
您应该能够使用Explicit Interface Implementations创建具有相同签名的两种方法。根据您枚举的内容,我只是将这些调用传递给内部IEnumerable<T>
,例如List或数组。
答案 3 :(得分:0)
实现非泛型接口显式允许两个方法具有相同的名称,并允许非泛型版本以通用版本的形式实现。沿着:
public class TestEnumerable : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
// Type-safe implementation here.
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}