假设我有以下类:
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 ++指针的模拟)
答案 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
,那么您的代码将更清晰,更易于理解和维护。