2014-01-11 1 views
0

라이브러리의 이미지 클래스가 있고 확장하려고합니다. 수퍼 클래스 메소드는 여러 경우에 새로운 수퍼 클래스 객체를 반환합니다. 수퍼 클래스 메서드가 반환 한 객체에서 하위 클래스 메서드를 사용하려면 어떻게해야합니까? 수퍼 클래스 객체를 서브 클래스 객체로 변경하는 방법이 있습니까?슈퍼 클래스 obj를 서브 클래스 obj로 변경하는 방법이 있습니까?

public class LibraryClass extends SomeBaseClass { 
    LibraryClass someMethodThatChangesDataReturningNewObject() { 
    } 
} 

public class MyClass extends LibraryClass { 
    // methods that extends functionality 

    // possible to override superclass method calling it and turning the LibraryClass 
    // obj into a MyClass obj and return that? 
} 

someRandomMethod() { 
    MyClass obj = new MyClass; 
    LibraryClass newObj = obj.someMethodThatChangesDataReturningNewObject(); 
    // possible to bind my subclass methods to newObj? 
} 
+0

그냥 캐스트를 사용하십시오. – ApproachingDarknessFish

+0

Valek - 만약 당신이 (라이브러리 클래스) obj. 내 질문에 내가 분명하지 않았던 것 같아. 만약 당신이 (MyClass) newObj를 의미한다면 그것은 작동하지 않을 것이라는 나의 이해입니다. 수퍼 클래스를 사용하고 하위 클래스를 반환하는 복사 생성자를 만드는 방법이 있는지 궁금합니다. 또는 넓은 클래스를 더 좁게 만드는 다른 수단. 수퍼 클래스에서 서브 클래스로 이동합니다. – alex

+0

왜 그렇게하고 싶습니까? newObj를 MyClass를 기대하는 메소드에 전달해야한다면, Liskov Substitution Principle을 준수하는 한 newObj를 수행 할 수 있어야한다. 진짜 문제가 뭐니? –

답변

1

글쎄, 당신은 같은 것을 할 수 있습니다 : 당신은 그냥 MyClass.someMethodThatChangesDataReturningNewObject()의 구현이 사실 MyClass의 인스턴스를 반환하지 않도록해야

MyClass obj = new MyClass(); 
MyClass newObj = (MyClass) obj.someMethodThatChangesDataReturningNewObject(); 

. 이 경우

MyClass obj = new MyClass(); 
LibraryClass newLibraryClass = obj.someMethodThatChangesDataReturningNewObject(); 
if (newLibraryClass instanceof MyClass) { 
    MyClass newObj = (MyClass) newLibraryClass; 
    // MyClass specific processing here 
} 

을 객체가 MyClass의 인스턴스가 아닌 경우는 : 메소드의 구현은 단지 부모 구현을 호출하는 경우 다음과 같이 if 문에 캐스팅 포장 안전 할거야 ClassCastException이 표시되지 않습니다. MyClass의 인스턴스가 아닌 경우 해당 처리가 실행되지 않는다는 점을 명심하십시오.

다른 방법으로는 LibraryClass의 데이터를 사용하여 새 MyClass 인스턴스를 만들 수있는 생성자 또는 기타 유틸리티 메서드를 만드는 것입니다. LibraryClass의 필드 또는 getters/setter가 개인용인지 보호 된 것인지에 따라 가능하거나 불가능할 수 있습니다. LibraryClass의 세부 사항을 모른 채 말하기가 어렵습니다. 그러나 나는 비슷한 모양을 기대합니다 :

MyClass(LibraryClass libraryClass) { 
    this.setField1(libraryClass.getField1()); 
    this.setField2(libraryClass.getField2()); 
    ... 
} 
관련 문제