我可能做错了什么。 当我扩展一个类时,我指定了extendee的构造函数和扩展类构造函数之间的映射:
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
我可能错过了在没有所有仪式的情况下添加参数的更简洁方法。 或者我应该使用特征而不是子类化,这样简单的事情....
答案 0 :(得分: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)'
但是,名称需要完全匹配。