我可以向现有 class 添加新的构造函数吗?
Can I add a new constructor to an existing class?
在 Scala 中,可以使用 implicit class 向对象添加新方法:
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
是否有添加新构造函数的机制?无论是 new Int("1")
还是 Int("1")
或类似的东西。
通常答案是否定的。要将构造函数或 apply
添加到 TargetClass
方法,您应该控制 class TargetClass
或其同伴 object TargetClass
的来源必须在同一个文件中。
如果您的目标实际上是 Int
,则可以使用以下 hack 使其工作:
object IntEx {
def Int(s: String): Int = s.toInt
}
import IntEx._
val v: Int = Int("123")
这个 hack 之所以有效,是因为 Int
没有伴随对象,因此 Int
被解析为 IntEx.Int
方法。它不适用于任何 class 定义的伴生对象,包括任何 case class
因为它将在名称解析中优先。
仍然最重要的问题可能是为什么您希望它看起来像构造函数而不是显式工厂方法?我的意思是
到底出了什么问题
object IntEx {
def intFromString(s: String): Int = s.toInt
}
val v2: Int = IntEx.intFromString("123")
或
object IntFromString {
def apply(s: String): Int = s.toInt
}
val v3: Int = IntFromString("123")
在 Scala 中,可以使用 implicit class 向对象添加新方法:
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
是否有添加新构造函数的机制?无论是 new Int("1")
还是 Int("1")
或类似的东西。
通常答案是否定的。要将构造函数或 apply
添加到 TargetClass
方法,您应该控制 class TargetClass
或其同伴 object TargetClass
的来源必须在同一个文件中。
如果您的目标实际上是 Int
,则可以使用以下 hack 使其工作:
object IntEx {
def Int(s: String): Int = s.toInt
}
import IntEx._
val v: Int = Int("123")
这个 hack 之所以有效,是因为 Int
没有伴随对象,因此 Int
被解析为 IntEx.Int
方法。它不适用于任何 class 定义的伴生对象,包括任何 case class
因为它将在名称解析中优先。
仍然最重要的问题可能是为什么您希望它看起来像构造函数而不是显式工厂方法?我的意思是
到底出了什么问题object IntEx {
def intFromString(s: String): Int = s.toInt
}
val v2: Int = IntEx.intFromString("123")
或
object IntFromString {
def apply(s: String): Int = s.toInt
}
val v3: Int = IntFromString("123")