用较少的仪式扩展scala课程

时间:2014-10-01 20:49:24

标签: 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

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

1 个答案:

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

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