2012-10-11 101 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