用较少的仪式扩展scala课程

我可能做错了什么.
当我扩展一个类时,我指定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

我可能错过了在没有所有仪式的情况下添加参数的更简洁方法.
或者我应该使用特征而不是子类化,这样简单的事情….

最佳答案
必须在案例类声明中指定案例类生成的apply方法的所有参数,因此您的第二个提案无法工作.如果Base是抽象的,使用抽象的val可以完成第一个:

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)'

但是,名称需要完全匹配.

转载注明原文:用较少的仪式扩展scala课程 - 代码日志