0

我正在处理一些需要将超类或子类对象发送到方法的代码。

该方法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);
    }
}   

我想我有三个选择:

  1. 保留代码原样,它似乎正在工作。- 我不喜欢这个选项,感觉就像我在做假设,我怀疑只有汽车的方法可能会被意外调用,从而导致意外行为。
  2. 在 car 中创建一个 getVehicle() 方法,以返回一个 Vehicle。然后用repair(Car.getVehicle());——这个感觉好一点
  3. 我相信改变Car = new Car();Vehicle = new Car();会创建一个只能执行车辆类型方法的对象(车辆)。- 这感觉是最安全的,因为我现在正在限制可以做的事情,以防止意外行为。

考虑到维修方法只期待车辆,3,最好的方法是什么?

另外,我可以/应该对public void repair(Vehicle vehicle)方法声明做些什么吗?

编辑:看来我应该使用:

保留代码原样

因为该repair()方法无论如何都会将子类对象转换为超类对象。

4

1 回答 1

8

没有修理的定义,但我认为你想要这样的东西

public abstract class Vehicle {
    //class stuff
}

public class Car extends Vehicle {
   //class stuff
}


public class Garage {
   public void repair(Vehicle vehicle){
   ....
   }
}

然后您可以将 Vehicle 的任何子类传递给 repair 方法。在这种情况下,它只是汽车,但您可以扩展到拥有自行车、摩托车等。

现在您将不需要使用 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);
}  

如果在访问变量 b 和 c 时您需要特定于 Car 和 Bike 的方法,那么您可以将它们的声明更改为

Car c = new Car();
Bike b = new Bike();
于 2012-10-11T09:46:02.913 回答