2012-06-22 6 views
3

내부 인터페이스를 구현하는 내부 클래스를 개발 중입니다. 누구나 내 메서드를 내부로 선언 할 수없는 이유를 설명 할 수 있습니까? 왜 내가 다음과 같은 오류가 발생합니다 : "공용 멤버가 아니기 때문에 인터페이스 멤버를 구현할 수 없습니다".내부 인터페이스를 구현하는 메서드를 공개해야하는 이유

나는 그 방법을 공개로 선언해야한다는 것을 알고 있지만 그것은 나에게 절대적으로 의미가 없다.

인터페이스와 클래스가 모두 내부 클래스 인 경우 메서드를 public으로 선언해야한다는 점은 무엇입니까? 오해의 소지가 아니십니까?

나는 a related question on this site을 읽었습니다. 내 클래스가 내부 클래스이기 때문에 정확한 복제본이 아닙니다.

+1

인터페이스가 인터페이스의 본질에 영향을 미치지 않거나 영향을 미치지 않는 이유는 무엇입니까? – BoltClock

+0

@BoltClock 나는 아무것도 공개하고 싶지 않습니다. 내부가 더 나은 선택입니다. –

답변

9

간단히 말하면 언어 디자이너가 설계 한 방식이기 때문입니다. 내부 인터페이스에서도 방법은 암묵적으로 공개됩니다. 그것은 단순하게 보이지만 다른면에서는 고통입니다.

내부 인터페이스의 사용을 "숨기려면"공개 클래스를 원한다면 명백한 인터페이스 구현을 사용할 수 있습니다. 단점은 있지만 그럴 수도 있습니다.

물론 클래스가 내부 클래스이면 메서드가 공용이라고해도 상관 없습니다. 다른 어셈블리는 형식을 볼 수 없기 때문에 메서드를 호출 할 수 없습니다.

C# (또는 .NET 일반적으로)이 내부 인터페이스와 같이 신중하게 설계되지 않았다는 것에 확실히 동의합니다.

의 관점에서 정확히 오류 메시지가 나타나는 이유는 무엇입니까? C# 4 사양의 13.4.4 절 (인터페이스 매핑)이 이유입니다. 구현은 비 정적 public 멤버 및 명시 적 인터페이스 멤버 구현에서만 발견되며 인터페이스에 구현되지 않은 멤버가 있으면 오류가 발생합니다.

+0

Jon, 다음과 같은 내용이 무엇을 의미하는지 설명해 주시겠습니까? "일이 단순 해지지 만 다른 방법으로는 고통이됩니다". –

+2

@ArneLund : 명시 적 인터페이스 구현은 때때로 놀라운 결과를 가져올 수 있으며 기본 클래스의 기존 인터페이스를 먼저 호출하는 파생 클래스에서 인터페이스의 * 새 구현을 제공하기 어렵거나 불가능하게 만듭니다. 동적 타이핑에도 실패합니다. –

+0

고마워요! 나는이 겉으로보기에는 일관된 행동이 불법으로 여겨지는지 궁금해하고있었습니다. C#이 신중하게 설계되지 않았다고 설명했습니다. 나 한테 의미가있어. 주말을 즐겨라! –

관련 문제