1

그래서 내가하려는 것은 추상 클래스에 필드가 있고이 추상 클래스가 하위 클래스에서 상속 될 때 클래스의 자식으로 해당 필드를 가질 수 있어야합니다. 추상적 인 부모.abastract 부모 필드의 하위 클래스를 지정하는 방법

예를 들어 플레이어를 상속 한 추상 플레이어 클래스와 클라이언트 및 상대 플레이어 (멀티 플레이어 게임용)가 있습니다. 플레이어에는 유닛 유형의 필드가 있습니다. 유닛 자체는 ClientUnit 및 OpponentUnit에 의해 상속됩니다. Client 생성자에 ClientUnit을 전달하고 Unit (상속, duh)으로 할당 할 수 있지만 ClientUnit 객체의 형식으로 예외를 넘겨받지 않고 반환하는 게터는 어떻게 만들 수 있습니까?

편집 : 문제를 더 잘 설명하기 위해 몇 가지 코드를 추가했습니다.

public abstract class Player { 
    private Unit unit;   

    public void setUnit(Unit unit) { 
     this.unit = unit; 
    } 
    public Unit getUnit() { 
     return unit; 
    } 
} 

public class Client extends Player { 
    @Override 
    public ClientUnit getUnit() { 
     return (ClientUnit)super.getUnit(); 
    } 
} 

작동하는 것처럼 보이지만 안전하고 강력한 방법인지는 잘 모릅니다.

+0

어떤 예외? 너 뭐 해봤 니? 반환 형식을보다 구체적으로 만들기 위해 메서드를 재정의 할 수 있다는 것을 알고 계십니까? –

+1

일부 코드를 제공하십시오. 더 많은 사람들이 문제를 해결하려고 노력할 것입니다. 방문자 패턴이 필요한 것처럼 보입니다. –

+0

나는 추상 클래스에 개인 필드 필드를 가지고 있고 거기에서 getters와 setters를 사용하고, getter와 setter를 ClientUnit과 stuff에 캐스트로 덮어 쓰려고 시도했다. 그러나 그것을하는 강력한 방법은 아닌지 잘 모르겠다. – Whiskydog

답변

1

:

public abstract class Player<T extends Unit> { 

    private T unit; 

    public Player(T unit) { } 

    public T getUnit() { 
     return unit; 
    } 

    public void setUnit(T unit) { 
     this.unit = unit; 
    } 
} 

그리고 구현 클래스 :

public class Client extends Player<ClientUnit> { 

    public Client(ClientUnit unit) { 
     super(unit); 
    } 

    public static void main(String[] args) { 
     Client client = new Client(new ClientUnit()); 
     ClientUnit unit = client.getUnit(); 
    } 
} 
-1

부모 클래스 필드를 private 대신 protected으로 설정해야합니다. 이 방법은 서브 클래스 내에서 필드에 액세스 할 수 있습니다. 내가 질문을 이해하지만, 어쩌면 Type Parameters 당신을 도울 수 확실하지 않다

+1

이 작업은 ClientUnit 객체의 형태로 반환하는 _a 게터와 어떤 관련이 있습니까? –

+0

@SotiriosDelimanolis "이 필드에 액세스하여 하위 클래스의 생성자를 통해 값을 전달하지 않고도 getter로 전달할 수있는 방법"이라는 질문을 이해했습니다. 해결책은 보호 된 필드에 액세스하는 것입니다. 어쩌면 내가 질문을 잘못 했어.하지만 내가 읽은 것이 맞아. – mumpitz