2014-10-01 31 views
3

我可能做錯了什麼。 當我擴展類,我指定的extendee的構造和擴展類的構造函數之間的映射:用較少的禮儀擴展一個Scala類

class Base(one: String, two: String) 
case class Extended(one: String, two: String, three: String) extends Base(one, two) 

我怎麼能代替的東西,如以下任何足夠了,從而暗示了「默認」映射?

class Base(one: String, two: String) 
case class Extended(one: String, two: String, three: String) extends Base 

class Base(one: String, two: String) 
case class Extended(three: String) extends Base 

我可能錯過了更簡潔的方式,只是增加一個參數,沒有所有的儀式。 或者我應該使用一個特點,而不是繼承,對於這樣簡單的事情....

+1

「pass-thru」類參數的簡單語法除了方便之外,還有其他原因:https://issues.scala-lang.org/browse/SI-4762 – 2014-10-01 22:59:46

回答

10

所有一類case產生apply方法的參數都在case類聲明中指定,所以你的第二個提案不能工作。第一個可如果Base是抽象的,使用抽象val s內完成:

abstract class Base { 
    // no initializers! 
    val one : String 
    val two : String 

    def print { println("Base(%s, %s)" format (one, two)) } 
} 
// Note: constructor arguments of case classes are vals! 
case class Extended(one: String, two: String, three: String) extends Base 
... 
Extended("foo", "bar", "baz").print // prints 'Base(foo, bar)' 

然而,名稱必須完全匹配。