2012-12-05 182 views
4

這裏的一件事:我有一些基本類,例如:斯卡拉構造繼承

abstract class Car(private val model: String = "no name") 

,我想有類擴展Car,例如:

class Mazda(model: String) extends Car(model) 

我的問題是:如何創建馬自達實例沒有像這樣的給定模型:new Mazda並具有名稱爲no name的對象?

回答

5

爲了實現自己的目標,你將不得不在子類中定義默認:

class Mazda(model: String = "no name") extends Car(model) 
+1

我試過了,但是想象一下,我創建百子類,我不wan't在每個人寫'字符串=「NO NAME」'。那就是爲什麼我創建超類的構造函數,以避免複製我的代碼。現在我想用它。 – squixy

+4

我認爲這可能是你的最終目標。如果你期望有許多不同的類,你可能想完全採用不同的方法,而不依賴於繼承。例如,如果您沒有爲每個子類添加不同的行爲或數據,則可能需要使Car具體並添加make屬性。 – yakshaver

+0

我現在這樣做的方式是創建沒有默認參數並在類中檢查的'Car'構造函數if(name =「」)name =「no name」'當每個類在構造函數中的默認值爲''' 。我沒找到更好的解決方案。 – squixy

0

我覺得這是不可能的,並嘗試理由:

  1. 基本上只是想要一個輔助構造函數Mazda以不同方式調用超類構造函數
  2. 輔助構造函數最終會調用缺省構造函數,其中調用超類構造函數。
  3. 超類構造函數只在默認構造函數中以一種形式出現。 (?)

像C++這樣的語言可以給你你想要的,因爲構造函數是相互獨立的,並且在那裏自己調用超類的構造函數。在Java中,你可以執行兩種方式,依賴和獨立。但是,你必須爲每個子類編寫輔助構造函數,這是更多的工作。

0

不知道這是你想要的,但

abstract class Car(private val model: String = "no name") 
class Mazda extends Car 

您現在可以創建馬自達只需用

val car = new Mazda 

和模型的價值將是"no name"

+2

我想他也希望能夠做到'新馬自達(「MODELNAME」)'調用'汽車(「MODELNAME」)'... – Kane

+1

@Kane - 這正是我需要的:'新馬自達(「3」 )'當模型是已知的,而且當我還不知道模型時,也是'新馬自達'。 – squixy

0

怎麼樣延伸一些沒有名字的東西?

trait DefaultNameIsNoName extends Car { 
    override name = "no name" 
} 

class Fiat extends Car with DefaultNameIsNoName 

或者有其他雜牌類,你可以繼承:

class NoNameCar extends Car with DefaultNameIsNoName 

class Packard extends NoNameCar 

不過:這是什麼意思有沒有型號車嗎?你確定你在模擬真實的東西嗎?

+0

其實我只是''特徵',我的抽象類'汽車'延伸。 有時真的需要爲馬自達創造引擎,而不是特定的類型。 – squixy

1

我不認爲你的問題已經完全回答,部分原因是你沒有接受yakshaver的回答。這個問題的答案建議你這樣做:

abstract class Car(private val model: String = "no name") 
class Mazda(model: String = "no name") extends Car(model) 

在這種情況下,調用new Mazda給你你想要的結果。但它並不完全令人滿意,因爲魔術字符串"no name"發生在兩個不同的地方。你可能會希望你能找出一種方法來調用Car構造不帶參數從Mazda構造,也許這樣的事情裏面:

// does not compile! 
class Mazda(model: String) extends Car(model) { 
    def this() { super() } // attempt at an auxiliary constructor 
} 

不幸的是,任何輔助構造具有最終調用,直接或間接地,這個類的主要構造函數。所以,如果你希望能夠指定在某些情況下,一個Mazda建設的model,也沒有辦法,你有時可以調用Car構造不帶參數。

如果你想避免魔"no name"串的重複,做的最好的事情是把它拉出來變成一個恆定的地方。例如,像這樣:

object Car { 
    val DefaultCarModel = "no name" 
} 
abstract class Car(private val model: String = DefaultCarModel) 
class Mazda(model: String = DefaultCarModel) extends Car(model)