2010-02-14 5 views
9

다음은 Java에서 다중 인터페이스 상속을 사용하는 예입니다. 문제가 있습니다.Java :이 다중 상속 모호성을 어떻게 부릅니까?

내가 왜 문제가 있는지를 완전히 알고 있으며 이것이 내 질문의 요지가 아님에 유의하십시오. 이 특정 다중 인터페이스 상속 모호성의 이름을 지정하는 방법에 대한 질문이 있습니다. C에서 예를 들어

, ++, 여러 구현 상속을 사용하고 "다이아몬드 문제"라고 재정의하는 사용 방법을 확인할 수없는 경우에 발생하는 모호성 : 다시 한 번 지금

http://en.wikipedia.org/wiki/Diamond_problem

, 나는 이 문제는 여기 같은 문제가 아니라는 것을 알고 있습니다. 요점은 이전 사건에서 이름이 만들어 졌다는 것입니다.

그리고 제가 설명하려고하는 이슈에 대한 이름이 있는지 알고 싶습니다.

interface A { 
    void a(); 
    Integer c(); 
} 

interface B { 
    void b(); 
    Long c(); 
} 

interface MI extends A, B {...} 

(사용 일에 통지 다중 인터페이스 상속이 "확장"키워드 : 여기

한 인터페이스가 호환되지 않는 메소드 리턴 형이 다른 두 인터페이스 상속 다중 상속의 다른 종류의 예

유형 A와 B가 호환되지 않습니다; 때문에)

당신은 할 수 없어 모두 는 이름이 그 상황을 설명하기 위해 만들어 낸 했 다()하지만 관련이없는 반환 유형

로 정의?

+0

이름이 같고 인수 유형, 반환 유형은 다르지만 호환되지 않는 다른 의미가 있으면 어떻게됩니까? 이 사건이 귀하의 질문에 포함될 것인가 말 것인가? – curiousguy

답변

3

특정 이름이 있는지, 아니면 적어도 매우 일반적으로 사용되는 것 같지 않습니다. 클래스 메서드에 대한 인터페이스 메서드의 암시 적 매핑 문제입니다. 반환 유형 만 다른 과부하를 가질 수 있다면 아무런 문제가 없습니다. 따라서 서명/과부하/암시 적 메서드 매핑 문제가 발생합니다.

"Thinking in Java"온라인 서적에는 이름도 없습니다. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001.htm

C#에서는이 문제를 해결하는 명시 적 인터페이스 구현을 허용합니다.

+0

링크에서 "인터페이스 결합시 이름 충돌"섹션의 I4에 대한 상황과 동일한 질문을하는 것이 아닙니까? 그래서 나는 그것이 인터페이스를 결합 할 때 "이름 충돌"이라고 생각합니다. 오해입니까? – MatrixFrog

+2

@MatrixFrog : 예,하지만 "인터페이스 결합시 이름 충돌"은 문제의 설명과 비슷하게 들리지만 문제의 "표준"이름과는 다릅니다. – Lucero

-2

Java의 인터페이스가 메소드 구현을 할 수 없기 때문에 이름이 정의되지 않았다고 생각합니다. 따라서 특정 메소드에 항상 하나의 구현 만 있기 때문에 문제가 발생하지 않으므로 모호성이 발생하지 않습니다.

요점을 놓친 적이 있거나 'c'변수에 대해 이야기하고 있습니까?

+0

예. 너는 그 요점을 놓쳤다. 질문을 다시 읽으십시오. – shoosh

+0

... 그리고'c'는 변수가 아니라 필드가 아니라 ... 메소드입니다. – Lucero

+0

@ 아연 : "모호성 없음"? 질문의 코드 샘플에는 모호함이 있습니다 :'MI.c()'의 구현은 무엇을 반환해야합니까? 정수 또는 정수? –

1

이 인터페이스를 다중 인터페이스 상 문제로 부르는 것을 주저하고 싶습니다. 인터페이스는 인터페이스 만 - 구현 클래스가 정의해야하는 메소드 세트 - 구현이 아닌 인터페이스를 잘 나타 내기 때문입니다. 인터페이스를 다른 인터페이스로 확장한다고해서 실제로 하위 인터페이스가 수퍼 인터페이스에서 상속 받았다는 의미는 아니지만 서브 인터페이스는 본질적으로이 두 인터페이스에 정의 된 메소드의 연결입니다.

세 번째 인터페이스를 사용하여 하위 인터페이스를 확장하고 충돌하는 메소드 선언을 제공하는 경우 동일한 인터페이스에서 동일한 두 가지 충돌하는 메소드를 제공 한 것과 본질적으로 같습니다.

+0

나는 동의하지 않는다 : Java에는 다중 인터페이스 상속이있다. 그리고 나는 그것이 여러 인터페이스 상속에 관한 것이라는 내 질문에 여러 번 언급했다. 그런 다음 '확장'키워드가 구체적으로 사용됩니다. 그렇다면 구현은 결국 OOA/OOD 레벨에 존재하지 않는 구현이기 때문에 여러 인터페이스 상속이 다중 상속이라고 생각하면됩니다. 실제로는 OOP 세부 사항입니다. 인터페이스 C는 확실하게 A와 B에 의해 정의 된 추상화를 계승하고 OOD 번역가에게 OOD 번역가로서 관심있는 것은 구현 세부 사항이 아닌 추상화입니다. – SyntaxT3rr0r

+0

@Tom : 두 번째 요점을 해결하기 위해 : 동일한 클래스 나 인터페이스에서 두 가지 충돌하는 메소드를 제공하는 것보다 더 복잡합니다. 여기 예제는 작동하지 않을 두 추상화 *에서 상속하는 인터페이스 ('extends 키워드'에 다시 주목하십시오) *가있는 유일한 경우입니다. 다른 모든 경우 Java에서 항상 다중 인터페이스 상속을 사용할 수 있습니다. – SyntaxT3rr0r

+0

나는 당신의 특정 요점에 동의하지 않으며 자바의 다중 인터페이스 확장 기능을 잘 알고 있습니다. 나는 단지 "당신이 그것을 보는 방법"이라고 지적하고있었습니다. 개체 지향 디자인 수준에서 구별이 있다는 것을 알고 있습니다. 그럼에도 불구하고 (의미를 넘어 클래스가 하위 인터페이스를 구현하지 않고 수퍼 인터페이스를 구현할 수있는 방법은) 한 인터페이스에서 정의 된 모든 메소드를 제공하는 것과는 다른 또 다른 인터페이스를 확장하는 방법입니다. – Tom

2

또한이 문제의 특정 이름을 알지 못합니다. 그것이 발생했을 때마다 어떤 점에서 반환 유형 비호 환성이라는 문장이 포함되어 있습니다. 불완전 매핑/설정은 자바 클래스 라이브러리에서 더 눈에 잘 띄고 귀찮은 예제 중 하나이기 때문에 호출 할 수도 있습니다. 지도가 remove (Object) 메서드를 Collection과 다른 반환 유형으로 정의하기 때문에 동일한 클래스에서 Map 또는 Set 또는 Collection을 구현할 수 없습니다.

public interface Collection<E> extends Iterable<E> { 
    boolean remove(Object o); 
} 
public interface Set<E> extends Collection<E> { 
} 
public interface Map<K,V> { 
    V remove(Object key); 
} 
0

당신이 설명하는 문제는 물론 Java와 같은 .NET에 존재하지만, 거기에 간단한 해결책이 있습니다 .NET Framework는 클래스가 다른 이름으로 클래스 멤버를 사용하여 인터페이스 멤버를 구현할 수 있습니다. 따라서 반환 유형에서만 다른 두 인터페이스 멤버를 구현하는 클래스 메서드는 서로 다른 이름을 가져야하지만 동일한 이름의 인터페이스 멤버를 구현할 수있는 능력을 배제하지는 않습니다.

인터페이스가 상충하는 멤버가있는 두 인터페이스를 상속하는 경우 복합 인터페이스를 구현하는 클래스는 상충하는 인터페이스를 직접 상속 한 것처럼 멤버를 구현할 수 있습니다. 결합 된 인터페이스의 사용자는 일반적으로 다른 인터페이스 유형 중 하나에 대한 참조를 변환하지 않고 어느 구성 요소 인터페이스의 구성원도 사용할 수 없지만 해당 캐스트는 다운 캐스트가 아닌 업 캐스트로 간주됩니다.

.NET에서 구현 된 체계는 잘 작동합니다. 불행히도 Java에서 이와 비슷한 작업을 수행 할 수있는 방법은 없습니다. 나는 인터페이스가 상충되는 멤버들과 다른 인터페이스를 상속받는다면 Java가 스 쿼크 할 것이라는 것을 알지 못한다. 그러나 그 시점에서 스 쿼크하는지 여부와 관계없이 구현할 수있는 클래스를 만들 방법이 없을 것이다.