2014-03-03 136 views
0

如果我有類驅動程序和類管理器。父母和孩子的ArrayList。不抽象

經理從驅動

public class Driver { ... 

繼承。

public class Manager extends Driver { ... 

我想寫一個簡單的登錄,所以經理有一個不同的菜單來執行更多的操作。但我無法弄清楚如何將這兩種類型存儲在我的Depot類的ArrayList中。

public class Depot { 

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>(); 

因爲顯然現在添加到此數組的任何東西現在都是驅動程序,而不是適用的管理程序。

,當我嘗試:

public ArrayList<? extends Driver> arrayDrivers = new ArrayList<Driver>(); 

我得到的錯誤:即使我改變

public Depot(ArrayList<Driver> tempDriver)  { 
    arrayDrivers.addAll(tempDriver); 
} 

ArrayList<? extends Driver> tempDriver 

誰能幫我出我不能想出解決辦法。

我知道最好是創建一個抽象類的用戶例如然後驅動程序和管理器,但它是課程作業,我必須按照圖和說明。

編輯:

我讀的地方,情況並非如此,我必須在被誤導。

因此,即使當我獲得像這樣的指針,它仍然應該作爲經理?

public boolean authenticateDriver(String username, String password, Driver driver) { 

    Driver userDriver = GetDriver(username); //Not a manager anymore? 

    if(userDriver != null) { 
     driver = userDriver; 
     return userDriver.checkPassword(password); 
    } 
    else { 
     return false; 
    } 

} 

public Driver GetDriver(String driver) { 
    for (Driver currentDriver : arrayDrivers) { 
     if (currentDriver.userName.equals(driver)) { 
      return currentDriver; 
     } 
    } 
    return null; 
} 
+1

你提到的第一個選項到底是什麼問題('ArrayList arrayDrivers')? –

+0

此信息可能對您有所幫助http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java – user2793390

回答

0

創建超類對象的數組列表。每當你想聲明子類對象,聲明如下:

Driver driver = new Manager(...); 

同樣的,當你想使用管理方法,採用鑄造調用驅動程序。

順便說一句,名字爲Manager的子類(Employee類和類ManagerEmployee extends Employee)的名稱可能使代碼更易於閱讀。我同意你—不是這個類命名系統的粉絲。

0

泛型並不完美。有時你必須降級事情才能通過編譯,並知道你的代碼維護合同。如果你將傳遞給addAll()的數組轉換爲原始列表,它將起作用。

public Depot(ArrayList<Driver> tempDriver)  { 
    arrayDrivers.addAll((List)tempDriver); 
} 
+0

我不認爲這是必要的。 arrayDrivers是'ArrayList '。當然,'.addAll'對另一個'ArrayList '有效,比如tempDriver,沒有任何強制轉換。 –

1

筆者認爲:

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>(); 

會工作。將管理器添加到此ArrayList時,它們不會成爲驅動程序。當你調用.showMenu()或其他東西時,多態性將保證管理器的showMenu()版本被調用。

+0

我不能在這裏正確回覆我更新我的問題... – nicwhitts

1

Manager延伸Driver,因此,如果您構建一個ArrayList<Driver>您可以在其中存儲Manager對象以及他們表現得像Manager,如適用。

這叫做,它允許你爲各種類型的對象定義不同的行爲,然後利用它,而不需要知道你將在運行時收到什麼樣的對象。

因此,您可以定義不同的.showMenu()方法DriverManager,當你得到一個對象Driver類的user並調用user.showMenu(),方法的相應版本將運行,這取決於userManagerDriver類的。

編輯:

關於你問題的第二部分,基本上,如果你有DriverManager類中定義的同樣的方法,它的一個適當的版本將被調用,這取決於你的對象的類。 如果但是隻有在Driver類中定義了它,則同一版本的方法將用於DriverManager對象。

如果只定義在Manager的方法,但不是在Driver,你將不能夠把這種方法用於Driver類型變量,不管他們會在運行時持有什麼類型的對象,因爲你永遠無法請確保該變量將始終包含Manager對象。

+0

我更新了我的問題 – nicwhitts

+0

我有Driver類中的isManager()方法,它只返回false。而在我的經理類中@Override返回true。但它似乎總是返回假? – nicwhitts

+0

@nicwhitts確保兩個方法簽名相同(參數相同,返回值相同),然後根據對象的類型得到正確的值。更多關於[方法重寫](http://docs.oracle.com/javase/tutorial/java/IandI/override.html)。 – Warlord