2013-06-13 5 views
2

고유하지 않은 이름으로 자동 생성 된 클래스가 있습니다. 이 클래스 나 클래스를 생성 한 파일을 변경할 수 없기 때문에이를 패키지에 넣었습니다. 이로 인해이 객체를 선언하거나 카스트 할 필요가있을 때마다 전체 패키지를 입력 할 필요가있었습니다. 이것에기본 객체를 기본 객체로 확장하는 객체로 변환

내 솔루션

public UniqueName extends BaseClass 
{ 
    // This class is empty and intended to be used as an alias. 
} 

불행하게도 내가 직렬화 및 역 직렬화 만 기본 클래스에서 수행 할 수있는 또 다른 문제로 실행 한 다음과 같이 서브 클래스를 만드는 것이 었습니다.

기본 클래스를 확장하는 별칭 클래스로 변환하는 방법이 있다면 알고 싶습니다. 별칭 클래스에 기본 클래스를 캐스팅 시도했지만 이클립스에서 여러 오류가 나타납니다.

+2

항상 공장을 사용할 수 있습니다. "패키지 추함"은 단 하나의 장소에있을 것입니다. – fge

+0

공장이란 무엇입니까? – JME

+0

@fge 또는 클래스를 참조하는 코드와 동일한 패키지에 클래스를 넣고 더 짧은 정규화 된 이름을 갖는 경우 동일한 기본 이름을 공유하는 다른 클래스의 정규화 된 이름을 사용하십시오. – JAB

답변

0

나는 어떤 이유로 BaseClass를 수정할 수 없으며보다 "유용한"버전의 BaseClass로 끝내기를 원한다는 것을 알고 있습니다. 대신 BaseClass로를 확장

의 UniqueName에 위임 :

public BaseClass{ 
    public void usefulMethod() { ... } 

    public void lessUsefulMethod() { ... } 
} 

public UniqueName 
{ 
    private BaseClass baseClass; 

    public UniqueName(BaseClass baseClass){ this.baseClass = baseClass; } 

    public void usefulMethod() { return baseClass.usefulMethod(); } 

    public void moreUsefulMethod(){ 
     ... 
     baseClass.lessUsefulMethod(); 
     ... 
    } 
} 

대신 형식 캐스팅 UniqueName에 BaseClass로에서, 당신은 매개 변수로 BaseClass로 복용 생성자를 사용 UniqueName의 인스턴스를 만듭니다.

UniqueName과 BaseClass의 "is-a"관계를 유지해야하는 경우 그렇게 할 수 있습니다. 그러나 각 메서드를 재정 의하여 기본 클래스 인스턴스에 위임하는 것을 잊지 마십시오.

추신 : 직렬화/직렬화에서 객체 대체에 문제가있는 경우 ObjectInputStream 및 ObjectOutputStream 클래스에는 replaceObject 및 resolveObject 메소드가 있으므로 serialization에서 객체 유형을 바꿀 수 있습니다.

관련 문제