2012-06-06 103 views
2

在我的UI項目中,我有幾個共享相同標題樣式的屏幕,只有文本特定於屏幕。什麼將是一個很好的實現方式?使用java抽象類

  1. 有超類創建所有的頭組件並打開組件的子類,子類將訪問組件的setText方法來更新文本?

  1. 有超類的抽象方法來創建組件,子類將實現這些方法來創建組件。

希望它是有意義..

+4

選擇選項1. :-) – maksimov

+0

有抽象方法。這樣,你永遠不會忘記改變文本,因爲你將不得不重寫它。並且在將來它將更容易找到頭部被改變的位置。儘管我認爲 –

+1

只有文本在屏幕之間變化。換句話說:實現取決於包含該文本的特定「字符串」。 [Esteban Araya的回答](http://stackoverflow.com/a/10918371/1332414)通過它的構造函數表達了這種依賴關係。 – Torious

回答

0

創建通用頭方法的抽象類,並確定實施將是最好的所有子類的一種方法。

0

取決於您是否希望超類能夠被實例化。這就像有一個Animal超類,DogCat子類。你想讓人們能夠創建一個通用的Animal

如果是這樣,它應該是一個普通的類。如果不是,則應聲明爲abstract

所以最終問題是:是否有默認行爲?如果不是,那就把它抽象化。

3

你真的需要抽象類嗎?

public class UIScreen { 
    public UIScreen(String headerText) { 
     //set everything up here w/ the right text 
    } 
} 

// elsewhere .... 

UIScreen mainScreen = new UIScreen("Main Screen"); 
0

第二種選擇是更爲可行。

記住:Single Responsibility Principle

兩個選項工作,但第二個會走更長的路,以減少代碼的耦合。

0

當行爲不斷變化時...將其封裝在abstact類或接口中。

其更好地有

Abstract class, with the non-abstract method to create the Header, 
and an Abstract method to create the text 

..In子U類可以通過實現抽象的方法來創建你所選擇的文本。

+0

然後我需要訪問組件,設置組件(Label)中的文本,爲什麼不直接打開組件到子類(但是這樣子類不會被迫改變文本) – Paneri

0

「在超類中有抽象方法來創建組件,子類將實現這些方法來創建組件。」

在我看來,這個解決方案更容易維護。

0

你可以改變你的選擇1稍微

public abstract class SuperUI { 

    private HeaderComponenet headerComponent;//have getter setter 

} 

public class BaseUI extends SuperUI{ 
    private void changeHeaderComponent(){ 
     headerComponent.setText("Changed"); 
    } 
} 

public class HeaderComponent extends JComponent{ 
    public HeaderComponent(){ 
     //create the default header here 
    } 
} 

在這種情況下,如果默認的標題組件必須改變你不必改變你的SuperUI,因爲你已經從SuperUI分離的頭,你如果需要,可以對頁腳組件執行相同的操作。

0

我的問題是子類是否有任何有用的功能?如果沒有,爲什麼你不只有一個具體的類,並傳遞一些數據容器來填充字段?

如果沒有行爲差異,只需將數據和/或協作者傳遞給構造函數或通過屬性設置器即可。

+0

所有的子類都會除了標題樣式以外,還有其他行爲。 – Paneri