2011-12-14 2 views
0

저는 최근에 단순한 클래스를 구형 클라이언트 버전의 레거시 버전과 별도의 인터페이스로 마이그레이션 한 최신 버전의 두 가지 버전으로 나눠야했습니다.인터페이스 구현을 오버로드해도 괜찮습니까?

일반적인 코드가 많으므로이를 2 개의 구체적인 클래스가있는 추상 클래스로 분할했습니다. 구조에서 다음과 같이 : AbstParentClass 또한이 인터페이스의 자녀를 구현 ParentInt 두 구체적인 클래스를 구현하기 때문에 발생할 수있는 함정이 있는지 내가 궁금하네요 것은

interface ParentInt { 
    // Common methods 
} 

interface ChildIntA extends ParentInt { 
    // Legacy methods 
} 

interface ChildIntB extends ParentInt { 
    // New model methods 
} 

abstract class AbstParentClass implements ParentInt { 
    // ... 
} 

class LegacyConcreteClass extends AbstParentClass implements ChildIntA { 
    // ... 
} 

class NewConcreteClass extends AbstParentClass implements ChildIntB { 
    // ... 
} 

? 이 상황에 더 좋은 패턴이있을 수 있습니까?

내 코드는 현재 AbstParentClass에이 지시어가 구현되어 있는지 여부에 관계없이 모두 작동합니다. 실제로 두 개의 구체적인 클래스가 서로 다른 스레드에서 개별적으로 인스턴스화되기 때문에 AbstParentClass는 실제로 다른 곳에서 직접 참조되지 않습니다.

내 경우 인터페이스는 API의 일부이므로 내 POV에서 변경할 수 없습니다.

+0

서로 확장하더라도 원하는만큼 많은 인터페이스를 상속 할 수 있어야합니다. 그러나 하나 이상의 클래스에서 상속받을 수는 없습니다 (그렇지만 그렇게하지 않아도됩니다.) – span

+1

자식 선언에서 누락 된 "AbstParentClass 확장"에 대해 모든 사람이 의견을 말합니다. 이것이 분명히 실제 코드가 아니기 때문에 그것은 단지 감시 였을 것이라 확신합니다. 우리가 실제 상황을 논의 할 수 있도록 그 선언을 추가했습니다. –

+0

고마워요, 어니스트, 네 말이 맞아, 그건 내 부분에 대한 감시 였어. –

답변

1

이 방법에는 문제가 없습니다. 명백한 "다중 상속"에 대한 귀하의 우려를 이해합니다. 그러나 Java에서 인터페이스를 처리하는 방식은 이런 종류의 문제가 결코 실제로 문제가되지 않도록합니다. 동일한 서명을 가진 인터페이스 메소드는 상속 된 동일한 인터페이스 메소드 수에 관계없이 "통합"되어 하나의 구현 메소드 만 허용되거나 필요합니다.

2

기술 문제가 없습니다. 응용 프로그램에서 의미가 있는지 여부는 별개의 문제이지만 그 대답에 대해서는 충분히 알지 못합니다.

문제가 될 수도 있고 아닐 수도있는 또 다른 사항은 레거시 인터페이스에 특별히 연결된 새로운 인터페이스입니다. 레거시 인터페이스가 사라지면 두 인터페이스를 연결 해제하거나 걸레질을 유지해야합니다.

새 클래스가 두 개의 인터페이스를 구현하도록하여 분리 된 상태로 유지하는 것이 더 쉬울 수도 있습니다. 추상적 인 기본 클래스를 확장하는 것이 합리적이든 아니든 조금은 조금 더 murkier가됩니다.

+0

고마워, Dave. 인터페이스 자체는 변경되지 않은 내부 API에서 가져온 것입니다. "레거시"인터페이스는 사라지지 않을 것이지만, 장래에 레거시 구체적인 클래스는 사용되지 않을 수 있습니다. 이를 반영하기 위해 예제를 업데이트했습니다. –

+0

@TomElliott 그렇다면 전혀 문제가 생기지 않습니다. 드물지 않은 패턴이 아닙니다. 아무 것도 '학부모'라고 말하지 않으면 그것에 대해 생각할 수도 있습니다. –

관련 문제