2014-02-20 62 views
2

我想聲明一個抽象類,它有一個變量在其子類中被初始化。例如,假設我們有一個名爲Country的抽象類和一個名爲United States的子類。 (我知道,通常你會讓美國成爲國家的一個實例,但我只是以此爲例,所以我們假設這是我們要做的設計。)我想要一個叫做bigCities的public final Set<String>但在國家未初始化,但將在美國初始化,如{「紐約」,「洛杉磯」,「芝加哥」}。我怎麼做到這一點? (我很抱歉,如果它之前被問過,但我的問題是很難制定精確的搜索條件。每當我嘗試搜索Google或StackOverflow時,我得到的問題類似但不是什麼我在找。)如何在Java中的抽象類中聲明未初始化的變量?

+5

我可能有超類,它是各種參數的構造函數,所以子類必須明確地具有價值 – njzk2

+0

你嘗試過什麼叫呢?堆棧溢出是爲了在用盡自己的資源後幫助解決問題。這是一個非常基本的問題,所以雖然提供答案很容易,但答案不會解決潛在的困惑(因爲我們無法看到卡住的位置) – gravityplanx

+0

我有50個這樣的問題就像bigCities一樣。我寧願不必將所有的函數都作爲參數,因爲這會使代碼看起來非常混亂。有沒有辦法解決這個問題? – Tony

回答

3

如果要定義你的財產bigCitiesfinal它必須在類的構造函數中被初始化,無論是Country或你的情況UnitedStates

public abstract class Country { 
    public final Set<String> bigCities; 
    public Country(Set<String> bigCities) { 
    this.bigCities = bigCities; 
    } 
} 

在這種情況下Country子類必須調用與指定參數的父類的構造函數。

1

有兩種方法可以做到這一點。你可以讓Country構造函數有一個名爲bigCities的參數,而像UnitedStates這樣的子類可以調用super(cities,otherArgs)。

或者,您也可以使一個抽象的方法,這樣

protected abstract Set<String> getBigCities(); 

,然後在國家的構造,設置bigCities該方法的實現。

bigCities = getBigCities(); 
+0

在這種情況下,您不能創建抽象方法,因爲屬性'bigCities'被聲明爲'final'。 – Manuel

+0

如你所描述的,在構造函數中調用非final方法也是一種不好的做法;對於他們在子類中的行爲沒有保證。 –

+0

@Manuel確定嗎?我只是跑了一個快速測試,似乎工作正常。 – kabb

0
abstract class Country { 

    public final Set<String> bigCities; 

    protected Country(String... bigCities) { 
     this.bigCities = new HashSet<String>(Arrays.asList(bigCities)); 
    } 

} 

class USA extends Country { 
    USA() { 
     super("NY", "Chicago"); 
    } 
}