這裏的一件事:我有一些基本類,例如:斯卡拉構造繼承
abstract class Car(private val model: String = "no name")
,我想有類擴展Car
,例如:
class Mazda(model: String) extends Car(model)
我的問題是:如何創建馬自達實例沒有像這樣的給定模型:new Mazda
並具有名稱爲no name
的對象?
這裏的一件事:我有一些基本類,例如:斯卡拉構造繼承
abstract class Car(private val model: String = "no name")
,我想有類擴展Car
,例如:
class Mazda(model: String) extends Car(model)
我的問題是:如何創建馬自達實例沒有像這樣的給定模型:new Mazda
並具有名稱爲no name
的對象?
爲了實現自己的目標,你將不得不在子類中定義默認:
class Mazda(model: String = "no name") extends Car(model)
我覺得這是不可能的,並嘗試理由:
Mazda
以不同方式調用超類構造函數像C++這樣的語言可以給你你想要的,因爲構造函數是相互獨立的,並且在那裏自己調用超類的構造函數。在Java中,你可以執行兩種方式,依賴和獨立。但是,你必須爲每個子類編寫輔助構造函數,這是更多的工作。
怎麼樣延伸一些沒有名字的東西?
trait DefaultNameIsNoName extends Car {
override name = "no name"
}
class Fiat extends Car with DefaultNameIsNoName
或者有其他雜牌類,你可以繼承:
class NoNameCar extends Car with DefaultNameIsNoName
class Packard extends NoNameCar
不過:這是什麼意思有沒有型號車嗎?你確定你在模擬真實的東西嗎?
其實我只是''特徵',我的抽象類'汽車'延伸。 有時真的需要爲馬自達創造引擎,而不是特定的類型。 – squixy
我不認爲你的問題已經完全回答,部分原因是你沒有接受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)
我試過了,但是想象一下,我創建百子類,我不wan't在每個人寫'字符串=「NO NAME」'。那就是爲什麼我創建超類的構造函數,以避免複製我的代碼。現在我想用它。 – squixy
我認爲這可能是你的最終目標。如果你期望有許多不同的類,你可能想完全採用不同的方法,而不依賴於繼承。例如,如果您沒有爲每個子類添加不同的行爲或數據,則可能需要使Car具體並添加make屬性。 – yakshaver
我現在這樣做的方式是創建沒有默認參數並在類中檢查的'Car'構造函數if(name =「」)name =「no name」'當每個類在構造函數中的默認值爲''' 。我沒找到更好的解決方案。 – squixy