2010-04-13 2 views
1

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

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

общественного абстрактную Самолет addAMeasurableThing (отслеживаемые м, внутр положение);

PassengerAirplane класс:

общественный самолет addAMeasurableThing (измеримые м, внутр положение) {если (м InstanceOf людей) ...

CargoAirplane класс:

общественный самолет AddAMeasurableThing (Meas urable м, внутр положение) {если (м InstanceOf контейнеров) ...

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

Спасибо!

+0

Возможно, вы можете добавить еще какой-нибудь свой код, похоже, что что-то еще происходит. –

+0

Да, вопрос непонятен. Что вы имеете в виду? «Я заметил, что addAMeasurableThing в классе CargoAirplane так и не получил вызов, потому что оба метода имеют одну и ту же подпись». Какова ваша реализация тестового класса? –

+0

Вы уверены, что используете метод? Потому что, если вы, вы не должны иметь проблему, которую вы описываете. –

ответ

6

Использование дженерик:

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

Это работало как рекламируемое! Благодарю. – Misa

0

Try глядя сделать ваш измеримый класс родовым, а затем использовать, например, Measurable<People>, Measurable<? extends Foo> и т. Д.

+0

Я новичок в Java, поэтому полный ответ помог немного больше. Благодарю. – Misa

0

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

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

+0

Это действительно помогло. Спасибо. – Misa

Смежные вопросы