Вопрос наследования Java - PullRequest
       7

Вопрос наследования Java

1 голос
/ 13 апреля 2010

У меня есть абстрактный класс Airplane и два класса PassengerAirplane и CargoAirplane, которые расширяют класс Airplane. У меня также есть интерфейс Measurable и два класса, которые его реализуют - People и Containers.
Таким образом, Самолет может делать много вещей сам по себе, и есть метод, который позволяет добавлять измеримые вещи в самолет (называемый addAMeasurableThing). Единственная разница между PassengerAirplane / CargoAirplane и просто Airplane заключается в том, что addAMeasurableThing должен принимать только людей / контейнеры, а не какие-либо измеримые вещи. Как мне это реализовать?

Я пытался сделать:
Класс самолета:

публичный абстрактный самолет addAMeasurableThing (Измеримая м, межд. положение);

Класс PassengerAirplane:

общедоступный самолет (Измеряемая м, int позиция) {если (м Люди инстанции) ...

Класс CargoAirplane:

общедоступный самолет (Измеряемая м, int позиция) {если (м экземпляр контейнеров) ...

Но когда я отлаживал его, я заметил, что addAMeasurableThing в классе CargoAirplane никогда не вызывается, потому что оба метода имеют одну и ту же сигнатуру. Так как же вызвать addAMeasurableThing соответствующего PassengerAirplane / CargoAirplane в зависимости от типа передаваемой измеряемой вещи?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 13 апреля 2010

Используйте дженерики:

abstract class Airplane<M extends Measurable>{
    public abstract Airplane addAMeasurableThing(M m, int position);
}

class PassengerAirplane extends Airplane<People>{
    @Override
    public Airplane addAMeasurableThing(People p, int position{ ... }
}
0 голосов
/ 13 апреля 2010

Это не тип параметра, который определяет, какой из них вызывается, это тип объекта. Таким образом, все зависит от того, был ли вы создан или передан в PassangerPlane или CargoPlane методу, вызывающему addAMeasurableThing. Это более сложный вопрос о том, как обеспечить, чтобы у вас был только нужный тип Измеримых, чтобы войти в плоскость. Например, вы можете просто сгенерировать исключение, если будет добавлено неверное измеримое значение, а затем еще выше по стеку вызовов проинформировать пользователя о проблеме. Это зависит от того, что определяет Измеримые объекты, которые должны быть переданы в Самолет.

Вам также может потребоваться статический метод в самолете (или новый класс AirplaneFactory), который возвращает вам правильный подкласс в зависимости от образца Mesurable, который вы передаете.

0 голосов
/ 13 апреля 2010

Попробуйте сделать родовой класс Измеримым, а затем, например, Measurable<People>, Measurable<? extends Foo> и т. Д.

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