Scala:在将构造函数参数发送到super之前,我如何处理它们?
我在学Scala。我想实现Scala:在将构造函数参数发送到super之前,我如何处理它们?,scala,constructor,Scala,Constructor,我在学Scala。我想实现Exception的子类,该子类获取一个名称作为参数,并构建一条嵌入该名称的消息。类似于此: class InvalidItem(itemName: String) extends Exception(msg: name) { def this(itemName)= { super("Invalid item: " + itemName) } } 在本例中,我只想在传递给超级构造函数之前,在itemName前面加上“Invalid item:”。但是我
Exception
的子类,该子类获取一个名称作为参数,并构建一条嵌入该名称的消息。类似于此:
class InvalidItem(itemName: String) extends Exception(msg: name) {
def this(itemName)= {
super("Invalid item: " + itemName)
}
}
在本例中,我只想在传递给超级构造函数之前,在itemName
前面加上“Invalid item:”
。但是我找不到路
我尝试过几种类似的语法(即用this
替换super
),但总是会出现一些隐晦的错误
在Scala中执行此操作的正确方法是什么?您实际上是在
extends
子句中调用父构造函数,因此以下操作有效:
class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)
有关此语法及其动机的讨论,请参见Daniel Spiewak的示例:
extends
子句中的那一点点额外语法就是
调用超类构造函数。。。这可能看起来有点奇怪
乍一看,但实际上提供了一种很好的语法方法来确保
对超级构造函数的调用始终是第一条语句
在构造函数中。在Java中,这当然是经过编译检查的,但是
从直觉上看,语法中没有任何明显的东西阻止你
从调用
实施在Scala中,调用超级构造函数并调用
超类方法实现是完全不同的操作,
句法上。这将导致更直观的理解流程
为什么一个可以任意调用,另一个必须先调用
对其他任何事情
谢谢你的回答。对于我的具体病例,特拉维斯的回答更简单,但我会记住你的建议,以便在我需要更复杂的治疗时使用。我知道这有点离题,但我仍然会利用这个机会引导你朝着这两个方向走。在scala中,它用于许多java中会出现异常的地方。在我看来,这是一个非常有用的概念。你可以看看这里:谢谢。我认为这两种情况对我来说都有点太高了。我昨天从Scala开始。我会记下笔记,让它在将来的时候看一看,当我对基本的东西比较熟悉的时候。
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
}