1

Так что я пытаюсь сделать это на абстрактном классе, есть поле, и когда этот абстрактный класс унаследован от своих дочерних элементов, он сможет иметь это поле в качестве дочернего класса указанного класса в абстрактном родителе.Как указать подкласс поля родителя abastract

Например, у меня есть абстрактный класс Игрока, а затем Клиент и Противник (он будет для многопользовательской игры), который наследует Player. У игрока есть поле типа Unit. Сама единица наследуется ClientUnit и OpponentUnit. Я знаю, что могу просто передать ClientUnit для своего конструктора Client и назначить его как Unit (наследование, duh), но как бы у меня был getter, который возвращает его в форме объекта 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

Я попытался использовать поле Unit в абстрактном классе и использовать геттеры и сеттеры оттуда, а затем переопределить те геттеры и сеттеры с приведением в ClientUnit и прочее, но я не уверен, что это надежный способ сделать это. – Whiskydog

ответ

1

Я не уверен, что понял ваш вопрос, но, возможно, Type Parameters может помочь вам:

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

Вы должны установить для поля родительского класса значение protected вместо private. Таким образом, поле доступно в подклассе.

+1

Что это связано с _a getter, который возвращает его в виде объекта ClientUnit_? –

+0

@SotiriosDelimanolis Я понял вопрос как «как я могу получить доступ к этому полю и передать его получателю без необходимости передавать значение через конструктор подкласса». Решением будет доступ к защищенному полю. Возможно, у меня вопрос неправильный, но это то, что я читал. – mumpitz