Проблема с кастингом (возможное решение) - PullRequest
0 голосов
/ 23 октября 2011

Хорошо, так что я получил задание от университета, и я просто не могу понять, как эта проблема, я единственный человек в классе, который зашел так далеко, и мой преподаватель не возвращается к мне.

В основном речь идет о наследовании и полиморфизме, мы используем родительский класс, а затем создаем дочерние элементы из родительского;

private HashMap<String,Aircraft> allAircraft = new HashMap<String,Aircraft>();
Aircraft plane = new Plane(reg,pass,cargo);

Таким образом, родитель не может использовать методы детей, я понимаю большинство концепции, стоящей за этим, и сумел обдумать это. Для одного из методов нас специально попросили использовать приведение (даже несмотря на то, что мне много раз говорили, что если я должен использовать его, то я должен реструктурировать), но для другого метода нас попросили вызвать метод, который только Что касается двух детских классов, приведение здесь не сработает, потому что я не знаю, что такое дочерние классы в HashMap.

Итак, мой вопрос; как бы я предпочел методы двух дочерних классов родительскому классу при использовании полиморфизма?

Мой разум буквально взрывается.

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

Если вам нужно понизить рейтинг, значит, вы больше не используете полиморфизм.Если это то, что хочет учитель, то вы все равно можете безопасно снизить рейтинг, проверив, что фактический тип объекта соответствует:

if (plane instanceof SubClass1) {
    SubClass1 s = (SubClass1) plane;
    s.someSpecificMethod();
}
if (plane instanceof SubClass2) {
    SubClass2 s = (SubClass2) plane;
    s.someSpecificMethod();
}

Если этот метод является общим для обоих подклассов, он можетозначает, что они на самом деле имеют один и тот же интерфейс.Так что полиморфизм может вернуться сюда:

public interface PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters();
}

public class SubClass1 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

public class SubClass2 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

if (plane instanceof PassengerTransporter) {
    PassengerTransporter p = (PassengerTransporter) plane;
    p.someSpecificMethodToAllPassengerTransporters();
}
0 голосов
/ 23 октября 2011

Вы можете узнать точный класс объекта, используя метод getClass(), или, в качестве альтернативы, вы можете спросить, является ли объект определенного типа, используя оператор instanceof.В любом случае, не очень удобно запрашивать объект для его определенного класса, но в некоторых случаях у вас нет выбора.

0 голосов
/ 23 октября 2011

Если вы не можете изменить базовую / производную иерархию на этом этапе, посмотрите на оператор instanceof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...