1

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

4 回答 4

6

您可以使用显式接口实现

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
    ...
}
于 2010-06-01T19:37:49.437 回答
3

在 Visual Basic 中,所有接口实现都是显式的

接口映射由Implements语句定义,因此您可以随意命名接口实现方法。(与 C# 不同,编译器通过匹配它们的名称和签名来推断哪些方法实现了接口。)

更改方法名称和可见性(视情况而定)是 VB 中的标准做法。请参阅在 VB.NET中实现接口以获得很好的概述。

于 2010-06-01T19:39:09.090 回答
1

您应该能够使用显式接口实现来创建具有相同签名的两个方法。根据您枚举的内容,我只需将这些调用传递给内部IEnumerable<T>,例如列表或数组。

于 2010-06-01T19:38:32.960 回答
0

显式实现非泛型接口允许两种方法具有相同的名称,并允许根据泛型实现非泛型版本。沿着:

public class TestEnumerable : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        // Type-safe implementation here.
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
于 2010-06-01T19:40:28.387 回答