我不確定把這個問題稱爲什麼,所以其他人可能會使用它,但我有一個來自我的老師的多態性的簡單例子,我試圖修改abit。安全多態實踐?
但我不確定我的修改是否「安全」。
public class AppSystem {
...
private DataPersistenceInterface DataDAO;
private DataController DataController;
...
public void createConnection(String username, String password)
throws ClassNotFoundException, SQLException {
if(username.isEmpty() || password.isEmpty()) {
DataDAO = new DataDAO();
DataController = new DataController(DataDAO);
} else {
DataDAO = new DataDAO(url, username, password, driver);
DataController = new DataController(DataDAO);
}
}
public void closeConnection() {
DataDAO.closeConnection();
}
我們有一個控制器和一個DAO。 DAO實現了一個名爲DataPersistenceInterface的接口,該接口承載了一些與數據庫進行通信所需的方法。由於數據控制器處理所有邏輯,並且我們不希望它知道其他任何內容,所以我們將它傳遞給接口類型中的DAO引用。
這是我的老師做的。然而,下面的方法「closeConnection」不會因此而起作用,因爲對DataDAO的引用並不指向DAO類中的任何「closeConnection」方法...
[closeConnection方法在上面不起作用代碼,顯然]
現在,我的想法是,只要改變......
private DataPersistenceInterface DataDAO;
到
private DataDAO DataDAO;
由於datacontroller在其構造函數中接受DataPersistenceInterface的參數,因此它不會從DAO對象知道其他任何內容。現在我可以在DAO上調用closeConnection了。
但我不確定這是「安全」嗎?有些東西告訴我它不是。
謝謝你的時間。
1)完全同意,這樣做! 2)請不要。定義接口並使用通過接口類型聲明的變量來隱藏真正的實現(* polymorphism *)是一種常見的做法。如果你想切換到另一個實現,那麼繼續,如果你使用實現類型,你必須改變每種用法的類型。 3)不要這樣做。你可以使用try-catch-finally塊,但是不能保證finalize方法的執行,並且有幾種情況報告其行爲方式與預期不同。 – Andy
是的,我同意你所有的評論......說「取決於用法」,我的意思是如果你爲老師做了一個Hello World,但你是對的...... – etienno