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

StackOverflow https://stackoverflow.com/questions/2952703

Вопрос

Мне часто приходится реализовывать некоторые интерфейсы, такие как 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() методы реализованы явно, и компиляция откажется, чтобы они имели одно и то же имя.Почему?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

public IEnumerator<T> GetEnumerator()
{
    ...
}

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

Реализация негенерического интерфейса явно позволяет оба метода иметь одинаковое имя, и позволяет реализовать негенерическую версию с точки зрения общего. В соответствии с:

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

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top