2012-11-23 127 views
-1
public abstract class Vehicle { 

     public void drive(){ 
      spinTheWheels(subclass.getNumWheels()); 
     } 

     public void spinTheWheels(int wheelsTotal){ 
      .... 
     } 
} 

public class Car extends Vehicle { 
    private final int numWheels = 4; 

    ... 
} 

在上面的例子中,我想引用車輛內的numWheels。這怎麼可能?參考一個子類實例變量

回答

-1

那不可能,你可以用「超級」關鍵字,但不能反過來從子類只引用超類的變量。超類從來不知道它的子類。

0

這是不可能的。基類永遠不知道子類內部是什麼,主要是因爲它不知道它被繼承的地方。 這是因爲方法繼承應該正常工作。子類應該添加或修改基類的行爲,而基類應該包含所需的基本行爲和屬性。

編輯:內容加入到澄清OP的評論。

如果你想在基類來對車輪的數量的方法,在所有的可能性,這將需要知道的成員屬性或vairable稱爲NumberOfWheels的存在。在這種情況下,您需要在基本車輛類中聲明它。您將無法在派生類中聲明此變量並在基類中使用它。

我可以看到你這裏有兩個選擇,

  1. 在基礎類中,讓你的GetNumberOfWheels方法抽象的或虛擬的,並迫使派生類中使用它。在這種情況下,您的der cla分類可能會或可能不會有變量,但會被迫實施此方法。例如,你的一個派生類可能是HoverCraft,它沒有多個車輪變量。 GetNumberOfWheels方法可以返回0或根據您的實現需要引發異常。
  2. 我喜歡這一點,因爲這是做的更清潔的方式。您可以擁有一個具有多個車輪屬性的接口和一個GetNumberOfWheels方法。強制你的孩子班級暗示這一點。然後,每個派生類可以提供它自己的屬性和方法實現,並且您可以根據需要使用它。
+0

好感謝 - 不夠公平。但是,假設我想強制在Car子類中聲明numWheels。 我可以使用:抽象INT getNumWheels();在Vehicle類,例如,以強制實施一個汽車getNumWheels()方法。 是否有強制變量聲明的equivilent? – user1848181

+0

我不知道你有需要被繼承的基礎類什麼其他要求,但似乎這裏是小不一致。我會在上面編輯我的答案以提供更多細節。 – ryadavilli