Scala:在将它们发送到super之前,我如何使用构造函数params?

时间:2011-10-23 15:16:46

标签: scala constructor

我正在学习Scala。我想实现一个Exception的子类,它获取一个名称作为参数,并构建一个嵌入了该名称的消息。类似的东西:

class InvalidItem(itemName: String) extends Exception(msg: name) {
  def this(itemName)= {
    super("Invalid item: " + itemName)
  }
}

在这种情况下,我只想在itemName之前添加"Invalid item:",然后再将其传递给超级构造函数。但我找不到方法。

我尝试了几种类似的语法(即用super替换this),但不断出现神秘错误。

在Scala中执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:8)

您实际上是在extends子句中调用父构造函数,因此以下工作原理:

class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)

有关此语法及其动机的讨论,请参阅Daniel Spiewak的示例this blog post

  

extends子句中的一些额外语法就是你的方法   调用超类构造函数......这看起来有点奇怪   乍一看,但实际上提供了一种很好的语法方法来确保   对超级构造函数的调用总是第一个语句   在构造函数中。在Java中,这当然是编译检查的,但是   语法阻止你没有直觉明显的东西   从调用到超级构造函数更远的地方   实现。在Scala中,调用超级构造函数并调用   超类方法实现是完全不同的操作,   语法。这导致了更直观的理解流程   为什么一个可以任意调用而另一个必须先调用   其他任何事情。

答案 1 :(得分:1)

class InvalidItem private(val name: String) extends Exception(name)

object InvalidItem{
  def apply(name: String) = new InvalidItem("Invalid item: " + name)
}

object Text extends App{
    val item = InvalidItem("asd")
    println(item.name)
    //Invalid item: asd
}