2012-06-17 2 views
6
에 최소한의 변경을 포함

가능한 중복 :
Adding Extra method to interface추가 새로운 방법은 그래서 상속 클래스

내 수천 구현 된 내가 Interface X이 시나리오가있다 수업. 이제 Interface X에 새 메소드를 추가하고 싶습니다. 그래서 최소한의 방법으로 변경 내 모든 클래스

+0

인터페이스를 추상 클래스로 변경하고 기본 구현을 제공합니까? –

+8

수천 개의 수업이 있습니까? 와우. –

+0

@verisimilitude 곧이 솔루션으로 유지 보수의 악몽이 생기고 시스템에 많은 인터페이스가 도입되지 않을까요? – Thihara

답변

1

에 방법의 오버라이드 (override)의 문제를 해결하기 위해 어떻게 할 쉬운 방법이 없습니다. 인터페이스에 메소드를 추가하면 모든 구현 클래스가이를 오버라이드해야합니다. 인터페이스를 추상 클래스로 변경하면 구현 클래스도 리팩토링해야합니다.

그러나 당신은 클래스 계층의 권리가? 따라서 기본 클래스에서만이 메서드를 구현하여 작업을 최소화 할 수 있습니다. 하지만 그것은 당신의 구체적인 요구 사항과 세부 사항에 달려 있습니다. 그래서 나는 행복하게 구현할 것입니다! 당신이 그와 같은 새로운 방법을 구현하는 데 사용할 수있는 쉬운 클래스 계층 구조가 존재하지 않는 경우는

은 아마 당신이 미래의 유지 보수 노력을 감소 찬성 주요 재 작성에 대해 생각 시간이다. 내가 추가 방법을하기 만하면 클래스에 대한 인터페이스의 확장을 만들 것

+1

@verisimilitude가 댓글에 올린 링크를 읽었습니까? 당신이하지 않으면, 그것을 읽으십시오, 그것은 당신의 견해와 당신의 견해를 바꿀 것입니다. –

+0

예. 그렇지만 조만간 유지 보수 문제로 이어지지 않을까요? 또한 문제의 메서드가 어디서나 사용되는 경우 인터페이스가 유형으로 사용되는 경우이 솔루션이 많은 도움이되지 않을 경우 도입되는 메서드의 유형에 따라 달라집니다. – Thihara

+0

정말 달라질 수 있습니다. 즉, 10+ 이상의 클래스가 있고 그 중 일부 (예 : 2)를 원한다면 2 개의 클래스가 새 메서드를 구현하고 8+는 구현 (꽤 나쁜 디자인)을 수행하는 것과 같을 것입니다. 실제 인터페이스를 구현하는 모든 클래스가이 새로운 메소드를 가져야한다면 OP 질문이 제 위치에서 벗어나고 OP가 필요하다고 생각하지 않습니다 :). –

11

...

public interface BaseInterface { 
    public int exampleMethod(); 
} 

public interface ExtendedInterface extends BaseInterface { 
    public int anotherMethod(); 
} 

클래스의 수천은 이미 BaseInterface를 구현합니다. 추가 메서드가 필요한 클래스의 경우 ExtendedInterface을 구현하도록 클래스를 변경합니다. 당신의 객체가 같은 BaseInterface[] 배열로 콜렉션에 저장되어있는 경우

,이 유형 ExtendedInterface의 객체도 유형 BaseInterface의 객체이기 때문에 여전히 작동, 그래서 그들은 여전히 ​​같은 일반적인 수집에 저장할 수 있습니다. 당신이 ExtendedInterface의 새로운 방법에 액세스해야하는 경우

예를 들어

, 이것은, 그러나 ... 여전히

BaseInterface[] objects = new BaseInterface[2]; 
objects[0] = new ClassThatImplementsBaseInterface(); 
objects[1] = new ClassThatImplementsExtendedInterface(); 

완벽하게 유효하지만 객체가 BaseInterface 모음에 저장됩니다, 당신은해야합니다 당신이 그것을 사용하기 전에 ... ExtendedInterface로 캐스팅

BaseInterface[] objects = new BaseInterface[1]; 
objects[0] = new ClassThatImplementsExtendedInterface(); 

if (objects[0] instanceof ExtendedInterface){ 
    // it is an ExtendedInterface, so we can call the method after we cast it 
    ((ExtendedInterface)objects[0]).anotherMethod(); 
} 
else { 
    // it is a BaseInterface, and not an ExtendedInterface 
} 

이 또는 사용량에 따라 적합하지 않을 수 있습니다.

실제로 수천 개의 개체가 모두 새 메서드를 구현해야하는 경우이 메서드를 BaseInterface에 추가 한 다음 IDE 또는 텍스트 편집기의 기능을 사용하여 모든 클래스에 메서드를 구현해야합니다. 예를 들어, 텍스트 편집기에서 모두 열고 에 발견이-로 교체가 뭔가 각 클래스에 공통 이잖아 찾을 수 있습니까 및 는 공통 코드 + 새로운 방법에 대한 기본 코드로을 대체 할 수있다. 꽤 빠르고 고통스럽지 않습니다. 일부 IDE는 자동으로 모든 상속하는 클래스에 메소드 선언을 자동으로 추가하거나 적어도 마우스 오른쪽 버튼 클릭 메뉴에서이 작업을 수행 할 수있는 옵션을 제공합니다.

+0

이것은 이미 진술 된 것과 동일한 것입니다. – paulsm4

+0

동의하지만, 이것은 사용자의 요구 사항에보다 구체적이고, 예제 코딩이 포함되어 있으며, 제 의견으로는 링크 된 게시물보다 훨씬 이해하기 쉽습니다. 게다가, 나는 그 접근법에 동의하게 되었으니, 그 이유에 대한 답을 쓰지 않으시겠습니까? – wattostudios

2

새로운 방법이 인터페이스의 진정한 확장 인 경우 인터페이스를 편집하고 개발 환경의 도구를 사용하여 새로운 기능을 구현해야하는 모든 장소를 찾습니다. 그런 다음 일하십시오. Eclipse와 넷빈은 훌륭한 일을 할 것입니다.

[NB 나는 조금 그 리팩토링 도구는 수동 작업의 일부를 돌봐하지 놀라게하지만, 그래서 그것이 해요.]

새로운 방법은 대부분의 시간을 호출하지 않을 경우 당신이 newMethod()의 널 버전의 새로운 인터페이스 소비자에게 이전 인터페이스 객체를 전달할 필요가있는 경우

public interface NewInterface extends OldInterface { 
    void newMethod(); 
} 

, 당신처럼 뭔가를 할 수 : 예전의 코드에서 이전의 확장으로 새로운 인터페이스를 고려 :

public class NewInterfaceWrapper<T extends OldInterface> implements NewInterface { 

    private T wrapped; 

    public NewInterfaceWrapper(T wrapped) { 
     this.wrapped = wrapped; 
    } 

    // Define all the old interface methods and delegate to wrapped.method 

    // Now provide the null implementation of new method. 
    void newMethod() { } 
} 

... 

wantsNewInterface(new NewInterfaceWrapper(oldImplementer)); 

예쁜 것은 아니지만 큰 시스템은 일반적으로 나이가 들면서 거친 가장자리가 생깁니다.

+0

WATTO Studios처럼 보입니다. 나는 같은 생각을 가지고 있습니다. 도움이되지 않으면 삭제 해주십시오. – Gene

+0

포스트 보관 - 래퍼와 다른 접근 방식을 가졌습니다. – wattostudios