Как реализовать интерфейс, который требует повторяющихся имен участников?
-
22-10-2019 - |
Вопрос
Мне часто приходится реализовывать некоторые интерфейсы, такие как 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();
}
}