2013-02-22 27 views
15

我正在開發Android,並且有一個相對簡單的情況,我試圖以最好的方式實現。強制子類在java中設置變量

簡單地說,我有一個類定義給定屏幕的所有基本參數。從這裏,應用程序中的每個屏幕都是這個的一個子類。我需要屏幕(即子類)在其實現中設置變量的值(即每個屏幕必須定義它在導航樹中的級別)。

此外,理想情況下,這個變量應該是final當它被設置在子類(我意識到這可能是不可能的)。

什麼是最好的方式去做這件事?有沒有辦法在Java中正確執行這種行爲?

+3

這不能用可變來實現。但是抽象類可能需要實現特定的方法:此方法可以返回適用的值。 – 2013-02-22 02:20:04

+0

謝謝!我試圖沿着這條路線走下去,並被困在如何強制抽象函數被調用。我有一個空白的頭腦,忘記了無參數構造函數,並嘗試使用抽象構造函數...... – 2013-02-22 03:05:29

回答

27

@ pst的評論導致這種解決方案。

這不能用變量來完成。但一個抽象類可以要求一個特定的方法來實現:這種方法可能會返回應用價值

從聲明的abstract功能設置或返回的變量,你可以強制任何子類來正確地執行它。

接着,功能必須由外部類的每一個子類被調用。這意味着它必須在外部階層的某個地方完成。這可以在外部類的無參數的構造函數來完成,而不必擔心子類調用super

注:如果一個構造函數不顯式調用父類的構造函數,Java編譯器會自動插入一個呼叫超類的無參構造函數。如果超類沒有無參數的構造函數,你會得到一個編譯時錯誤。對象確實有這樣的構造,因此,如果對象是唯一的超類,是沒有問題的。 (Java docs: Super)

此基礎上,該解決方案將托起,並正確的變量,只要設置爲兩種:

  1. 沒有其他構造函數在超類中創建(因此超能「T在子類中被用來調用不同的構造來代替)
  2. 在超所有其他構造仍內部調用默認的構造函數

的代碼:

超類:

public abstract class SuperClass { 
    // Variable all inner classes must set 
    static int myVar = 0; 

    public SuperClass() { 
     myVar = giveValue(); 
    } 

    public abstract int giveValue(); 
} 

亞綱:

public class SubClass extends SuperClass { 

    @Override 
    public int giveValue() { 
     return 5; // individual value for the subclass 
    } 

} 
+1

謝謝!保存我的一天! – DevAndroid 2017-05-26 06:37:57

8

而不是強制執行該子類初始化的字段,你可以通過讓你的類的構造函數需要一個參數執行,爲您提供希望已經初始化的字段的接口遵循組成的策略。