1

종종 내 코드에 IEnumerable<T> 같은 일부 인터페이스를 구현해야합니다. 우리는 그들이 같은 행동을 할 것을 이해하더라도, 나는 두 GetEnumerator() 방법을 구현해야하지만중복 멤버 이름이 필요한 인터페이스를 구현하는 방법?

public IEnumerator<T> GetEnumerator() { 
    // Code here... 
} 

public IEnumerator GetEnumerator1() { 
    // Code here... 
} 

, 그들은 극단적으로 같은 이름을 가질 수 있습니다 자동으로 구현할 때

때마다, 나는 다음과 같은 발생 어쩐지. 컴파일러는 반환 유형 만 다르므로이를 다른 클래스의 오버로드로 처리 할 수 ​​없습니다.

이렇게하면 GetEnumerator1() 접근자를 private으로 설정할 수 있습니다. 이 방법으로, 컴파일러는 인터페이스 멤버를 구현하지 않는 것에 대해 불평하지 않고 단순히 메서드 본문에 NotImplementedException을 던집니다.

그러나 나는 그것이 좋은 연습인지 또는 내가 다르게 진행할 것인지, 아마도 방법 별칭 또는 그와 비슷한 것으로 생각합니다.

동일한 이름의 두 가지 메소드를 구현해야하는 IEnumerable<T>과 같은 인터페이스를 구현하는 동안 가장 좋은 방법은 무엇입니까?

EDIT # 1

는 VB.NET에 명시 적으로 이와 GetEnumerator1() 강제로 구현되기 때문에, 인터페이스를 구현하면서 VB.NET는 C#에 다르게 반응한다.

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() 방법이 명시 적으로 구현하고, 컴파일은 같은 이름을 가진 그들을 거부합니다 : 여기에 코드입니다. 왜?

+0

컴파일되지 않습니다. – SLaks

+0

글쎄, 내가 말하고자하는 것을 진술하는 예가되기 때문에 여기에는별로 중요하지 않습니다. 내 질문을 참조하십시오. =) –

+0

당신의 VB 메소드 선언이 * 다른 * 인터페이스 (generic과 generic IEnumerator 버전이 아닌)를 명시 적으로 구현합니다 : 컴파일러가 그것들을 허용하지 않는다고 말하는 것입니까? –

답변

3

Visual Basic에서 모든 인터페이스 구현은 명시 적입니다.

인터페이스 매핑은 Implements 문으로 정의되므로 원하는대로 인터페이스 구현 메서드의 이름을 지정할 수 있습니다. (컴파일러가 이름과 서명을 일치시켜 인터페이스를 구현하는 C#과 달리)

VB에서 메서드 이름과 가시성을 변경하는 것이 표준 방법입니다. 좋은 개요는 Implementing Interfaces in VB.NET을 참조하십시오.

+0

제발 내 질문에 편집하십시오. –

+0

'GetEnumerator1()'의 이름을'GetEnumerator()'로 바꾸면 컴파일러가 여전히 불만을 토로합니다. 이러한 시나리오에서 .NET이 선호하는 최상의 솔루션/접근 방식은 무엇입니까? 감사! =) –

6

당신은 explicit interface implementation를 사용할 수 있습니다

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

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

제발 내 질문에 편집하십시오. –

1

는 동일한 서명이 두 가지 방법을 만들 수 Explicit Interface Implementations을 사용할 수 있어야합니다. 열거하는 내용에 따라이 호출을 목록 또는 배열과 같은 내부 IEnumerable<T>으로 전달합니다.

+0

제발 내 질문에 편집하십시오. –

0

비 제네릭 인터페이스를 명시 적으로 구현하면 두 메서드가 모두 동일한 이름을 가질 수 있으므로 비 제너릭 버전을 일반 메서드로 구현할 수 있습니다. 줄을 따라 :

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

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

제 질문을 편집하십시오. –