如何实现需要重复成员名称的接口?

时间:2010-06-01 19:34:01

标签: .net-2.0 interface ienumerable implementation ienumerator

我经常需要在我的代码中实现一些接口,例如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()方法都是显式实现的,编译将拒绝它们具有相同的名称。为什么呢?

4 个答案:

答案 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();
    }
}