【发布时间】:2011-05-25 23:12:46
【问题描述】:
好的,在关于'Class Variables as constants' 的问题中,我知道常量在“官方”构造函数运行之后(即直到你有一个实例)才可用。但是,如果我需要同伴单例来调用班级怎么办:
object thing {
val someConst = 42
def apply(x: Int) = new thing(x)
}
class thing(x: Int) {
import thing.someConst
val field = x * someConst
override def toString = "val: " + field
}
如果我首先创建伴随对象,则“新事物(x)”(在伴随对象中)会导致错误。但是,如果我先定义类,“x * someConst”(在类定义中)会导致错误。
我也尝试将类定义放在单例中。
object thing {
var someConst = 42
def apply(x: Int) = new thing(x)
class thing(x: Int) {
val field = x * someConst
override def toString = "val: " + field
}
}
但是,这样做会给我一个 'thing.thing' 类型的对象
val t = thing(2)
结果
t: thing.thing = val: 84
我想出的唯一有用的解决方案是创建一个抽象类、一个同伴和一个内部类(它扩展了抽象类):
abstract class thing
object thing {
val someConst = 42
def apply(x: Int) = new privThing(x)
class privThing(x: Int) extends thing {
val field = x * someConst
override def toString = "val: " + field
}
}
val t1 = thing(2)
val tArr: Array[thing] = Array(t1)
好的,'t1' 的类型仍然是 'thing.privThing',但现在可以将其视为 'thing'。
但是,这仍然不是一个优雅的解决方案,谁能告诉我一个更好的方法来做到这一点?
附言。我应该提一下,我在 Windows 7 上使用 Scala 2.8.1
【问题讨论】: