我正在開發Android,並且有一個相對簡單的情況,我試圖以最好的方式實現。強制子類在java中設置變量
簡單地說,我有一個類定義給定屏幕的所有基本參數。從這裏,應用程序中的每個屏幕都是這個的一個子類。我需要每屏幕(即子類)在其實現中設置變量的值(即每個屏幕必須定義它在導航樹中的級別)。
此外,理想情況下,這個變量應該是final
當它被設置在子類(我意識到這可能是不可能的)。
什麼是最好的方式去做這件事?有沒有辦法在Java中正確執行這種行爲?
我正在開發Android,並且有一個相對簡單的情況,我試圖以最好的方式實現。強制子類在java中設置變量
簡單地說,我有一個類定義給定屏幕的所有基本參數。從這裏,應用程序中的每個屏幕都是這個的一個子類。我需要每屏幕(即子類)在其實現中設置變量的值(即每個屏幕必須定義它在導航樹中的級別)。
此外,理想情況下,這個變量應該是final
當它被設置在子類(我意識到這可能是不可能的)。
什麼是最好的方式去做這件事?有沒有辦法在Java中正確執行這種行爲?
@ pst的評論導致這種解決方案。
這不能用變量來完成。但一個抽象類可以要求一個特定的方法來實現:這種方法可能會返回應用價值
從聲明的abstract
功能設置或返回的變量,你可以強制任何子類來正確地執行它。
接着,功能必須由外部類的每一個子類被調用。這意味着它必須在外部階層的某個地方完成。這可以在外部類的無參數的構造函數來完成,而不必擔心子類調用super
:
注:如果一個構造函數不顯式調用父類的構造函數,Java編譯器會自動插入一個呼叫超類的無參構造函數。如果超類沒有無參數的構造函數,你會得到一個編譯時錯誤。對象確實有這樣的構造,因此,如果對象是唯一的超類,是沒有問題的。 (Java docs: Super)
此基礎上,該解決方案將托起,並正確力的變量,只要設置爲兩種:
的代碼:
超類:
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
}
}
謝謝!保存我的一天! – DevAndroid 2017-05-26 06:37:57
而不是強制執行該子類初始化的字段,你可以通過讓你的類的構造函數需要一個參數執行,爲您提供希望已經初始化的字段的接口遵循組成的策略。
這不能用可變來實現。但是抽象類可能需要實現特定的方法:此方法可以返回適用的值。 – 2013-02-22 02:20:04
謝謝!我試圖沿着這條路線走下去,並被困在如何強制抽象函數被調用。我有一個空白的頭腦,忘記了無參數構造函數,並嘗試使用抽象構造函數...... – 2013-02-22 03:05:29