我正在使用一些需要将超类或子类对象发送到方法的代码.
该方法public void repair(Vehicle vehicle)只能访问超类对象中的方法.
public class Vehicle {
//class stuff
}
public class Car extends Vehicle {
//class stuff
}
public static void main(String[] args)
{
// do stuff to determine whether working with a vehicle or car
if (someCondition)
{
Car = new Car();
// do some stuff...
repair(Car);
}
else
{
Vehicle = new Vehicle();
// do some stuff...
repair(Vehicle);
}
}
Run Code Online (Sandbox Code Playgroud)
我想我有三个选择:
repair(Car.getVehicle());- 这感觉好一点Car = new Car();到Vehicle = new Car();,我相信会创建一个对象(车辆)只能执行类型车辆的方法. - 这是最安全的,因为我现在限制可以做的事情,以防止意外行为.3,这是最好的方法,因为修理方法只是期待车辆?
另外,有什么我可以/应该对:public void repair(Vehicle vehicle)方法声明?
编辑:我似乎应该使用:
保持代码不变
因为该repair()方法无论如何都将子类对象强制转换为超类对象.
没有修复的定义,但我认为你想要这样的东西
public abstract class Vehicle {
//class stuff
}
public class Car extends Vehicle {
//class stuff
}
public class Garage {
public void repair(Vehicle vehicle){
....
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将Vehicle的任何子类传递给修复方法.在这种情况下它只是汽车,但你可以扩展到有自行车,摩托车等.
现在您不需要使用if语句进行检查.您可以将对象(或Car或其他任何内容)传递给repair方法.
你主要成为
public static void main(String[] args) {
Garage g = new Garage();
Vehicle c = new Car();
Vehicle b = new Bike(); //assuming Bike is a subclass of Vehicle.
g.repair(c);
g.repair(b);
}
Run Code Online (Sandbox Code Playgroud)
如果在访问变量b和c时需要Car and Bike特定方法,那么您可以将其声明更改为
Car c = new Car();
Bike b = new Bike();
Run Code Online (Sandbox Code Playgroud)