2012-05-13 53 views
0

我試圖解決這個問題,但我真的不明白的語法。 考慮下面的代碼:JAVA:如何調用一個對象的子類中的方法?

class Parent { 
    private String productCode1;  // Format X9999 
    private String productCode2; 

    public Parent(String productCode1, String productCode2) 
    { 
     this.productCode1= productCode1; 
     this.productCode2= productCode2; 

    } 

} 

然後我有一個子類至極包含下面的方法我想打電話給

public Child extends Parent{ 
    private String[] serialNumbers; 

    public Child(String productCode1, String productCode2, String... args){ 
     super(productCode1, productCode2,); 
     int i = 0; 

     for(String serialN: args){ 
      serialNumbers = new String[10]; 
      serialNumbers[i]= serialN; 
      i++; 
     } 

     public String[] getSerialNumbers(){  //This is the method i want to call 
      return this.serialNumbers; 
     } 
} 

這是庫存類

public class Inventory{ 

public ArrayList<Parent> products; 

public Inventory(){ 

    products = new ArrayList<Parent>(); //Some hard coded items 
    products.add(new Parent("A0001", "abcdefg")); 
    products.add(new Parent("B0010", "abcdefg")); 
    products.add(new Parent("C0100", "abcdefg")); 
    products.add(new Child("D1000", "abcdefg", "firstSN", "secondSN", "thirdSN")); 
} 

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){ 

    for(int i = 0; i < products.size(); i++){ 
     ProductLine product = products.get(i); 
     if(product.getProductCode().equals(productCode)){ 
      return product; 
     } 
    } 

    return null; 

} 

現在在主類我需要執行檢查,如果該對象是一個父對象或子對象做,我想獲得序列號,如果我得到一個它意味着是一個孩子,否則是父母。

唯一的問題我想要使用getserialNumbers(),這是在子類

public Application{ 
    String inputProductCode = keyboard.nextLine(); //Input product code from user 
    Inventory inventory = new Inventory(); 

    ProductLine pFound = inventory.getProduct(inventory.products, inputProductCode); //check if is Child item 

    String[] serNumb = pFound.getSerialNumbers(); //Here is where i get Error cannot find symbol/method getSerialNumbers 
    if(serNumb[0] == null){ 
      // code continue... 
} 

我試着投,如:

String[] serNumb = ((ItemisedProductLine)pFound).getSerialNumbers(); 

它編譯但他trows(如預計)在運行時,我是「父母不能投給孩子」。

我希望我解釋好 對不起長的問題...

回答

0

爲什麼父類沒有getSerialNumbers方法?我認爲你有2個選擇:在父類中實現或不考慮你的邏輯中的父母(用instanceof測試)。

+0

getSerialNumbers()返回一個在子類和父對象中不存在序列號的序列號數組。 –

+0

您可以在'Parent'中使用'getSerialNumbers()',總是返回一個長度爲零的數組。 – QuantumMechanic

2

沒錯。你不能做演員,因爲Parent根本不是Child

你可以使用instanceof來檢查你有什麼類型的對象,然後只有在你有一個Child的實例時進行強制轉換和調用,但是你通常要避免這樣做。這不是很好的OOP。

有一兩件事你可以做的就是把getSerialNumbers()方法Parent並一直返回一個空數組,然後重寫它在Child實際返回Child的序列號。

當然,這裏也許值得重新考慮整個班級層次。所有從Parent繼承的類別都有序列號是否有意義?如果是這樣,您應該考慮將所有序列號處理移至Parent。是否會有更多的子類ParentChild?如果沒有,也許Child應該被淘汰。

+0

沒有想過這個選擇,因爲蒂亞戈也建議我,我現在會嘗試,看看它是否有效。 –

0

除非直到父類中定義的抽象方法,否則不能調用子類的方法。因爲JVM不理解子類中的方法。爲此,您可以在Inventory課中進行以下操作。

public class Inventory{ 

public ArrayList<Parent> products; 

public Inventory(){ 

    products = new ArrayList<Parent>(); //Some hard coded items 
    products.add(new Child("A0001", "abcdefg")); 
    products.add(new Child("B0010", "abcdefg")); 
    products.add(new Child("C0100", "abcdefg")); 
    products.add(new Child("D1000", "abcdefg", "firstSN", "secondSN", "thirdSN")); 
} 

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){ 

    for(int i = 0; i < products.size(); i++){ 
     ProductLine product = products.get(i); 
     if(product.getProductCode().equals(productCode)){ 
      return product; 
     } 
    } 

    return null; 

} 
0

如果你的目標是要決定你的對象的類型是否爲父母或子女的,你可以用的instanceof關鍵字做到這一點:

if(pFound instanceof Child) { 
    //... 
} 

如果你想使用串行類型來區分數字,父類也必須僞裝getSerialNumber方法。

+0

作爲一個普遍的良好規則,父母不應該知道任何Child類的存在 - 一方面,它創建一個循環依賴 – Bohemian

+0

這是爲了Inventory類而不是父類。 –

1

這是OOP編程模型簡單的問題:

  • 任何Child實例是Parent實例也。
  • 任何Parent實例也可以是Child實例。

如果更改Inventory類的構造函數如下,你的程序做工精細:

public Inventory() 
{ 
    products = new ArrayList<Parent>(); //Some hard coded items 
    products.add(new Child("A0001", "abcdefg")); 
    products.add(new Child("B0010", "abcdefg")); 
    products.add(new Child("C0100", "abcdefg")); 
    products.add(new Child("D1000", "abcdefg", "firstSN", "secondSN", "thirdSN")); 
} 

或者更好的辦法是檢查鑄造Parent實例Child之前instanceof關鍵字。

相關問題