2012-10-11 79 views
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. 在车里创建一个getVehicle()方法,返回一个Vehicle。然后使用repair(Car.getVehicle()); - 这感觉好一点
  3. 更改Car = new Car();Vehicle = new Car();,我相信会创建一个对象(车辆),只能执行类型车辆的方法。 - 这感觉是最安全的,因为我现在限制了可以做的事情,以防止意外的行为。

是3,最好的方法,因为修理方法只是期待车辆?

另外,有什么我可以/应该去的:public void repair(Vehicle vehicle)方法声明?

编辑:看来我应该使用:

离开的代码,因为它是

因为repair()方法铸子类对象的父对象呢。

+0

那么你的修法样子? – RNJ

+2

当汽车进入修理方法时,它会隐式地投射到车辆上。所以你不可能在维修方法中使用Car方法。 – BeRecursive

+1

我认为汽车应该延伸车辆。 –

回答

6

没有修复的定义,但我想你想是这样的

public abstract class Vehicle { 
    //class stuff 
} 

public class Car extends Vehicle { 
    //class stuff 
} 


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

然后你就可以通过汽车的任何子类的修复方法。在这种情况下,它只是汽车,但你可以扩展到有自行车,摩托车等。

现在你不需要检查if语句。您可以将您的对象(或汽车或其他任何东西)传递给repair方法。

如果访问变量b时,您主要只是变得

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

和c,你需要汽车和自行车的具体方法,那么你可以改变他们的声明是

Car c = new Car(); 
Bike b = new Bike(); 
+0

感谢您的答案。我可能没有说清楚,但是if语句需要确定创建哪个对象。其他的东西,然后完成之前,调用修复()(在汽车或车辆对象) – Jonny

+0

什么其他的东西?这可以拉入车级的常用方法吗?如果你需要的话,那么你可以在里面做这个特定的东西。但是你应该能够在if语句之外调用Repair – RNJ