java 자바 - 부모 클래스와 자식 클래스가 모두 같은 인터페이스를 구현하는 이유는 무엇입니까?




예제 추상 (5)

레거시 Java (1.4) 코드를 상속 받았으며이 디자인 결정이 정기적으로 나타납니다. 어떤 목적이나 이유가 있는지 이해할 수 없습니다.

public interface SoapFacade extends iConfigurable{ }

public class SoapFacadeBase implements SoapFacade{
...
}

public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}

인터페이스를 이해하고 (실험이 강화되었습니다), 부모와 자식 모두 동일한 인터페이스를 구현하는 데 목적이 없습니다. 이 시나리오에서는 SoapFacade 모든 것이 SoapFacade 에 구현되지만 SoapFacadeBase 의 메서드는 iConfigurable 에 구현됩니다. 그러나 SoapFacadeImpl 구현할 필요가 없습니다.

이 패턴에 어떤 목적이나 이점을 줄 수있는 인터페이스에 대해 모르는 뭔가가 있습니까? 리팩터링을 수행해야하는 명확성이 부족한 데 따른 근본적인 비용이 있습니까? 또는 명확성 / 단순성을 위해 리팩터링해야합니까?


Answers

그것은 말도 안돼,하지 마.

특히 Java Collections와 같은 공개 API에서 특히 그렇습니다. 그것은 절대 말도 안돼.


인터페이스를 표식으로 사용하는 경우. Class.getInterfaces(); 직접 인스턴스화 된 인터페이스 만 반환합니다.


나는 그 디자인이 무의미한 것을 실제로 발견한다. 앞에서 설명한대로 구현 된 인터페이스는 상속되므로 자식 클래스에 "SomeInterface 구현"을 복사하여 붙여 넣을 필요가 없습니다. 그것은 더 명확하고, 똑똑하지 않으며, 무엇이든지 ...


인터페이스를 이해하고 (실험이 강화되었습니다), 부모와 자식 모두 동일한 인터페이스를 구현하는 데 목적이 없습니다.

아닙니다. 기술적으로 완전히 중복됩니다.

그러나 SoapFacadeImplSoapFacadeImpl 로 만들려고한다는 사실을 문서화하고 개발자 (또는 다른 사람)가 기본 클래스에서 implements SoapFacade 을 제거하기로 결정한 경우 컴파일 오류가 발생하도록 보장합니다.

이 패턴은 표준 Java Collections API의 모든 곳에서 볼 수 있습니다. ArrayList 는 기본 클래스 ( AbstractList )가 이미 존재하더라도 ArrayList 구현합니다. HashSet / AbstractSetSet 인터페이스에도 동일하게 적용됩니다.


기본 클래스의 상속자는 "is a"관계를 가져야합니다. 인터페이스는 "구현"관계를 나타냅니다. 상속자가 관계를 유지할 때만 기본 클래스 만 사용하십시오.





java inheritance interface