Как реализовать интерфейс, который требует повторяющихся имен членов? - PullRequest
1 голос
/ 01 июня 2010

Мне часто приходится реализовывать некоторые интерфейсы, такие как 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 ]

6 голосов
/ 01 июня 2010

Вы можете использовать явную реализацию интерфейса :

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

public IEnumerator<T> GetEnumerator()
{
    ...
}
3 голосов
/ 01 июня 2010

В Visual Basic все реализации интерфейса являются явными .

Отображения интерфейса определяются оператором Implements, поэтому вы можете называть методы реализации вашего интерфейса как угодно. (В отличие от C #, где компилятор определяет, какие методы реализуют интерфейсы, сопоставляя их имена и подписи.)

Изменение имени метода и видимости (при необходимости) является стандартной практикой в ​​VB. См. Реализация интерфейсов в VB.NET для хорошего обзора.

1 голос
/ 01 июня 2010

Вы должны иметь возможность использовать Явные реализации интерфейса , чтобы создать два метода с одинаковой сигнатурой. В зависимости от того, что вы перечисляете, я просто передаю эти вызовы внутреннему IEnumerable<T>, такому как List или массив.

0 голосов
/ 01 июня 2010

Реализация неуниверсального интерфейса явно позволяет обоим методам иметь одно и то же имя и позволяет реализовывать неуниверсальную версию в терминах универсальной. По линиям:

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

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