我碰巧发现一个特征中不允许有抽象的私有字段,也就是说,
trait A1 {
//private val a: Int // Not allowed
protected val b: Int // OK
}
如果私有字段是构造函数参数,那么对抽象类做这样的事情似乎没问题,也就是说,
abstract class A2 (private val i: Int) // OK
所以我猜一个特征没有构造函数参数,所以没有办法初始化它们,因此不允许抽象私有字段。
如果它们是“受保护的”,那么子类可以使用预先初始化的字段来初始化它们。这种方法允许子类看到这些字段。
如果我只想初始化它们并在之后隐藏它们怎么办,如下例所示?
object holding {
trait trick {
protected val seed: Int // Can't be private
final def magic: Int = seed + 123
}
trait new_trick extends trick {
def new_magic: Int = magic + 456
def the_seed: Int = seed // [1]
}
def play: new_trick = new { val seed = 1 } with new_trick
def show_seed(t: new_trick): Int = t.the_seed // [2]
}
我不希望任何人能够看到种子,也就是说,不应该允许 [2](因此 [1])。有没有办法让特质做到这一点?
正如@Randall 和@pagoda_5b 所指出的,我的问题没有多大意义。但幸运的是@Régis 和@axel22 将它变成了另一个有趣的问题,并提供了解决它的模式。