我正在学习Scala。我想实现一个Exception
的子类,它获取一个名称作为参数,并构建一个嵌入了该名称的消息。类似的东西:
class InvalidItem(itemName: String) extends Exception(msg: name) {
def this(itemName)= {
super("Invalid item: " + itemName)
}
}
在这种情况下,我只想在itemName
之前添加"Invalid item:"
,然后再将其传递给超级构造函数。但我找不到方法。
我尝试了几种类似的语法(即用super
替换this
),但不断出现神秘错误。
在Scala中执行此操作的正确方法是什么?
答案 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
}