2012-10-01 30 views
2

由於考慮了優雅的解決方案,我的頭很疼。我有一個父類和幾個子類。我的父類聲明並實現了一個方法來檢索屬性,但屬性文件的名稱由子類決定。使用子類的字段執行父方法

我只處理子類的實例。

該方法(在父級中實現)應該使用子類的字段值,但由於我在父類中使用它,我還需要在其中聲明它。

現在,每次我從子類調用方法時,都會使用父類的字段值。

一些簡單的代碼來說明我的問題(請記住:它不是關於功能 - 更多關於設計)。定義字段值的子類,我想用:

public class SubClass extends Parent { 
    public static final String CONFIG_FILE = "subclass.properties"; // same problem with non-static 
    public SubClass() { 
    System.out.println(getProperty("somekey")); 
    } 
} 

和父類的定義和實現方法我想使用:

public class Parent { 
    public static final String CONFIG_FILE = "config.properties"; // same problem with non-static 
    public String getProperty(String key) { 
    Properties props = new Properties(); 
    try { 
     props.load(new FileReader(new File(CONFIG_FILE))); 
    } 
    catch (IOException ioe) { 
     return null; 
    } 
    return props.get(key); 
    } 

由於我從子類調用getProperty(..),我會期望它使用它正在操作的實例的字段值(「subclass.properties」),而是使用父字段值(「config.properties」)。我獲得了與非靜態字段相同的效果。

+0

這可以解決使用波希米亞和thiago.lenz答案。 –

+0

不,這兩個答案都不適用於該問題。我想避免在子類中一次又一次地實現這個方法,並且我有幾個。 –

回答

2

在你的子類將這個。這將會返回子類的屬性。此方法將覆蓋父類中的一個。

public String getProperty(String key) { 
    return CONFIG_FILE; 
} 

順便說一句,你是shadowing變量。

另外,我會建議將變量名傳遞給構造函數,然後讓它調用超級。

public SubClass() { 
    super(SUB_CLASS_CONFIG); 
} 

,然後讓家長construtor像

public Parent(String key) { 
    CONFIG_FILE = key; 
} 

,那麼你就不必重寫方法。該方法只能返回父配置。我會仔細考慮你是否希望它是靜態的......

+0

你給了我一個好主意。我的'SubClass'現在定義了'CONFIG_FILE'將它傳遞給構造函數'Parent(String fileName)'。然後,我可以在'SubClass'中執行'getProperty(「somekey」)'',它將使用'Parent'的實現,但是文件名爲私有字段'fileName',爲其設置值'Parent(String fileName)'的構造函數。所以只有你的第一個代碼片段沒有什麼幫助。但感謝您的建議! –

1

只是在子類中覆蓋(即執行)getProperty()。在你的代碼

+0

在我的子類中覆蓋'getProperty(..)'沒有幫助。我希望父母實施該方法。所以'return super.getProperty(key)'將會得到相同的輸出。 –

+0

不需要在子類中實現這個方法就是這裏的挑戰。 –

3

看,您使用的是Parent.CONFIG_FILE,在子類中你應該使用SubClass.CONFIG_FILE

+0

我有幾個子類,但父級必須處理所有這些子類。我需要像'<?繼承Parent>。CONFIG_FILE' –

+0

你的解決方案只有在我不想在子類中實現該方法時才起作用,因爲功能是相同的(文件名除外)。 –