2013-01-25 5 views
0

많은 프로젝트에 연결할 수있는 툴킷으로 사용하고있는 Java 클래스 세트가 있습니다. 이 툴킷의 코드를 변경하고 싶지 않으므로 언제든지 버그를 수정하거나 업데이트 할 수 있습니다. 로컬 변경 사항에 대해 걱정할 필요없이이를 사용중인 프로젝트에 코드를 놓을 수 있습니다.자식 개체를 부모 개체로 사용하는 방법은 무엇입니까?

FILE : 툴킷/개()

public class Dog(){ 
    public void pet(){ 
    print("scratch ruff"); 
    } 
} 

로컬 프로젝트 툴킷에서 메서드를 재정의해야하는 경우 따라서, 난 그냥 같은 같은 툴킷 객체의 로컬 버전을 만들 FILE : 지역/개()

public class Dog extends toolkit/Dog { 
    public void pet(){ 
    print("rub ears"); 
    } 
} 

그리고 로컬 객체에서, 나는 지역 Dog 객체 대신 툴킷 Dog 객체를 참조하십시오.

지금까지 큰 성과를 올렸지 만 문제가 발생했습니다. 이 툴킷의 다른 클래스는 Dog을 사용합니다.

FILE : 툴킷/DogHandler

public void careForPack(List<Dog> arg_allTheDogs){ 
    for(Dog fido : arg_allTheDogs){ 
    fido.pet(); 
    } 
} 

시스템이이 같은 Dog 대상이 아닌 것을 좋아하지 않는다는 것입니다 발생하는 문제. DogHandler을 로컬로 오버라이드하고 싶지는 않습니다. 왜냐하면 필자의 전체 툴킷을 오버라이드 할 수 밖에 없기 때문입니다.

Dog의 자식 (Dog이라고도 함)을 DogHandler이 올바른 것으로 인식 할 수있는 방법이 있습니까?

+0

전체 클래스 이름으로 한정 ... <로컬 패키지 이름> .Dog이 트릭을 수행해야합니다. – Shark

+3

'공개 무효화 careForPack (리스트 arg_allTheDogs) {'? – OldCurmudgeon

+0

나는 방법 서명에 toolkit.dog를 사용하고 싶지만 방법 본문에는 실제, 지역 dog를 사용하고 싶어한다. – Shark

답변

4

처럼 보이는 것 같아요. 이 경우 ? extends T을 사용할 수 있습니다.

public void careForPack(List<? extends toolkit.Dog> arg_allTheDogs){ 
    for(toolkit.Dog fido : arg_allTheDogs){ 
    fido.pet(); 
    } 
} 
+0

왜 downvote? 이것이 올바른 해결책입니다. +1. –

+0

요청한 내용이 아닙니다. 그는 개를 사용하기 위해 careForPack이 필요합니다 ... 런타임 데이터 유형 평가가 아니라 인터페이스를 제안합니다 ... – Shark

+0

나는 뒤집어 썼습니다. 나는'확장형 '을 의미하는'super'를 썼습니다. 닌자 편집, @ JBNizet 주셔서 감사합니다! :) –

0
public void careForPack(List<toolkit.Dog> arg_allTheDogs) 
{ 
    for(local.package.name.Dog fido : arg_allTheDogs) 
    { 
     fido.pet(); 
    } 
} 

편집 : 아마도 이것을?

//we need an interface to have datatype interchangability 
public class Toolkit.Dog implements IToolkitDog 
{ 
    public void pet() 
    { 
     print("toolkit dog says what"); 
    } 
} 

//we inherit the IToolkitDog from Toolkit.Dog 
public class local.Dog extends Toolkit.Dog 
{ 
    public void pet() 
    { 
     print("rub ears"); 
    } 
} 


//both toolkit.dog and local.dog are of type IToolkitDog 
public void careForPack(List<IToolkitDog> arg_allTheDogs) 
{ 
    for(local.Dog fido : arg_allTheDogs) 
    { 
     fido.pet(); 
    } 
} 

트릭이 가능한가요?

나는 당신이 toolkit.Dog을 확장하는 당신의 툴킷 방법은 유형의 List 포함하는 객체를 수용해야이

public interface IToolkitDog 
{ 
    pet(); 
//... 
} 
+0

나는 충분히 명확하지 않았다. 지역 코드에서 List 인수로 toolkit.DogHandler.careForPack()을 호출하고 작동시켜야합니다. –

+0

우, 당신은 폐쇄를 원하는 것처럼 들립니다. 로컬로 toolkit.DogHandler.careForPack()을 재정 의하여 toolkit.Dog 대신 local.Dog를 사용하려고합니다. Java7을 기다리거나 코드를 인터페이스하십시오. – Shark

+0

마찬가지로 Dog를 단순히 확장하는 대신 IToolkitDog 인터페이스를 만들고 Local Dog로 구현 한 다음 List ... 대신 List 을 사용하도록 처리기를 변경하면 Toolkit Dog와 로컬 개를 모두 사용할 수 있습니다. – Shark

관련 문제