Проблема наследования Java - PullRequest
0 голосов
/ 11 ноября 2010

Предположим, у меня есть следующие классы:

class car1 {}
class car2 {}
class car3 {}
class car4 {}

Поддержка У меня также есть метод: queryCar ()

private Object queryCar()
{
     int version = getCarVersion(); // returns car version
     if (version == 1)
         return new car1();
     else if (version == 2)
         return new car2();
     else if (version == 3)
         return new car3();
     ...
}

У меня есть другой метод doStuff ()

private void doStuff()
{
     // psudocode
     if queryCar() returns a car1, I want to create a JPanel with an instance member of type car1
}

Как мне выполнить указанный псевдокод?InstanceOf работает для определения класса.Тем не менее, я хочу, чтобы только один класс автоматически генерировал эту машину в кратчайшие сроки.(Думая об аналоге указателей C ++ в Java)

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

Вы должны использовать наследование, делайте то, что вам нужно.

abstract class Car {
    public Car queryCar();
    public int getCarVersion();
    public void doStuff() {
        JPanel j = new JPanel();
        j.add(new JLabel(queryCar().getCarVersion()));
    }
}

class Car1 extends Car {
    public Car queryCar() { return new Car1(); }
    public int getCarVersion() { return 1; }
}
0 голосов
/ 11 ноября 2010

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

Как правило, общее поведение, скажем, Car и добавьте или переопределите поведение, зависящее от версии, в каждом из подклассов.

РЕДАКТИРОВАТЬ: В своем методе doStuff вы должны тщательно продумать, действительно ли вам 1011 * необходимо проверить подкласс.Это будет трудно поддерживать, если вам требуется различное поведение для каждого подкласса, поэтому вам следует подумать, можете ли вы переместить некоторую логику в классы carN или суперкласс Car и удалить зависимость.Если вы можете написать свой doStuff в терминах более общего Car интерфейса / суперкласса, тогда ваш код будет чище, его будет легче понять и поддерживать.

0 голосов
/ 11 ноября 2010

Вы можете сделать это, используя instanceof с Object, как вы, но это может упростить использование автомобильного интерфейса, подобного этому:

interface Car {}
class Car1 implements Car {}

private void doStuff {
    Car car = queryCar();
    if(car instanceof Car1) {
        Car1 theCar = ((Car1) car);
        theCar.car1OnlyMethod();
        //Or
        ((Car1) car).car1OnlyMethod();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...