2015-05-19 74 views
8

我有一個抽象類,其參數的默認值。 我不想在所有可能的實現的構造函數中重用默認值。父類中的Scala繼承默認參數

abstract class Place(val place: String = "World") 
class Message(val message: String = "Hello", p: String) extends Place(p) { 
    override def toString = s"$message $place" 
} 

我要得到什麼

new Message("Hi", "Universe") = "Hi Universe" // Ok 
new Message("Hi") = "Hi World" // Doesn't work, second parameter is required 
new Message() = "Hello World" // Doesn't work, second parameter is required 

我使用輔助構造省略第二個參數考慮,但它並沒有幫助,因爲你不能調用主構造之外的超級構造函數。

我想知道如何去做,或者爲什麼它是不可能的。我不在尋找解決方法,就像不使用繼承一樣。

回答

1

你可以在一個更優雅的方式重新使用默認值:

object Place { 
    val defaultPlace = "World" 
} 
abstract class Place(val place: String = Place.defaultPlace) 
class Message(val message: String = "Hello", p: String = Place.defaultPlace) extends Place(p) { 
    override def toString = s"$message $place" 
} 
+0

作品。不如封裝。在這裏你有3個對象來對付(對象,抽象和類)。特別是不要對具有相同名稱的對象和摘要進行評分。類消息必須知道有關對象的地方,所以使用它需要更多的接線,如果這是有道理的。抽象和具體應該處理這一切。 – Drew

3

恐怕這是不可能的。很簡單,你將一個值傳遞給Place構造函數,所以它不會使用默認值,無論它的值是多少。如果你不介意有一個變種,而不是纈氨酸,這裏是你的3箱子工作的變種:

abstract class Place(var place: String = "World") 
class Message(val message: String = "Hello") extends Place() 
{ 
    def this(message: String, place: String) = { 
     this(message) 
     this.place = place 
    } 
    override def toString = s"$message $place" 
} 

在構造斯卡拉有點亂七八糟恕我直言的。有時候更好的答案就是在配套對象上使用工廠apply()方法,這些方法更加靈活。