Java继承问题

时间:2010-11-10 21:24:52

标签: java inheritance polymorphism

假设我有以下类:

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
}

我如何完成所述的psudocode? InstanceOf用于确定类。但是,我只想让一个班级在runttime上自动生成那辆车。 (想一想java中C ++指针的模拟)

3 个答案:

答案 0 :(得分:5)

你应该使用继承来做你需要的事情。

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; }
}

答案 1 :(得分:0)

您可以像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();
    }
}

答案 2 :(得分:0)

这取决于您的carN课程之间的共同行为。在Java中,一切都会自动扩展Object,因此您总是拥有一个公共基类,但Object可能不是特别有用的公共基础。

通常,将常见行为放在Car中,并在每个子类中添加或覆盖特定于版本的行为。

编辑:在您的doStuff方法中,您应该仔细考虑是否确实需要检查子类。如果您确实需要为每个子类提供不同的行为,那么很难维护,因此您应该考虑是否可以将某些逻辑移动到carN类或Car超类中并删除依赖项。如果您可以使用更通用的doStuff接口/超类来编写Car,那么您的代码将更清晰,更易于理解和维护。