在 Traits 中初始化值
Initializing values in Traits
我有一个巨大的 class 想要打破许多特征。我的 class 的每个部分都有一组其他部分未使用的值。这些参数是从 属性 文件中读取的,有时会进行一些计算。我想让每个特征负责初始化自己的变量。我希望这些值对特性是私有的。不幸的是,特征没有构造函数(这是我真正想要的)。
创建混合一组特征的对象的模式是什么,其中特征具有需要初始化的值?
这是一个例子:
class Foo( properties: Properties ) extends Bar with Baz
trait Bar {
private val something
}
trait Baz {
private val somethingElse
}
如何初始化 Bar.something 和 Baz.somethingElse 而不使它们抽象和非私有,或者添加 init() 方法并使它们成为变量?
谢谢
彼得
好的,这是一种方法。还有更好的吗?
class Foo( val properties: Properties ) extends Bar with Baz
trait Bar {
val properties: Properties
private val something = properties.get("Something")
}
trait Baz {
val properties: Properties
private val somethingElse = properties.get("SomethingElse")
}
您可以直接在此处进行计算。这是一个例子。
def readPropertyFile(s: String) = {
println("Pretending to read " + s); 0
}
trait Bar {
private val something = readPropertyFile("Bar.properties")
}
class Foo extends Bar {
println("Hi, I am in class Foo")
}
scala> val foo = new Foo
Pretending to read Bar.properties
Hi, I am in class Foo
foo: Foo = Foo@27d8f985
只要您的资源是全球性的,您就可以轻松获取它们。如果没有,请将它们混合在较早的特征中。
提前初始化怎么样?
trait A {
val f: String
val a = "I would have used " + f
}
trait B {
val f: String
val b = "I would have used " + f + " too!"
}
class C extends { val f = "the string" } with A with B
如果你把它扔到 REPL 中:
scala> List(c.a, c.b).map(println _)
I would have used the string
I would have used the string too!
这是我最终使用的一种更简洁的方法
class Foo( val propertyFile: String ) extends Bar with Baz with Zot
trait Bar extends Properties {
private val something = getProperty("Something")
}
trait Baz extends Properties {
private val somethingElse = getProperty("SomethingElse")
}
trait Zot extends Properties {
private val somethingWeird = getProperty("Something") + getProperty("SomethingElse")
}
trait Properties {
val propertyFile: String
private val properties = readProperties(propertyFile)
protected def getProperty(name: String) = properties.get(name)
}
我有一个巨大的 class 想要打破许多特征。我的 class 的每个部分都有一组其他部分未使用的值。这些参数是从 属性 文件中读取的,有时会进行一些计算。我想让每个特征负责初始化自己的变量。我希望这些值对特性是私有的。不幸的是,特征没有构造函数(这是我真正想要的)。
创建混合一组特征的对象的模式是什么,其中特征具有需要初始化的值?
这是一个例子:
class Foo( properties: Properties ) extends Bar with Baz
trait Bar {
private val something
}
trait Baz {
private val somethingElse
}
如何初始化 Bar.something 和 Baz.somethingElse 而不使它们抽象和非私有,或者添加 init() 方法并使它们成为变量?
谢谢 彼得
好的,这是一种方法。还有更好的吗?
class Foo( val properties: Properties ) extends Bar with Baz
trait Bar {
val properties: Properties
private val something = properties.get("Something")
}
trait Baz {
val properties: Properties
private val somethingElse = properties.get("SomethingElse")
}
您可以直接在此处进行计算。这是一个例子。
def readPropertyFile(s: String) = {
println("Pretending to read " + s); 0
}
trait Bar {
private val something = readPropertyFile("Bar.properties")
}
class Foo extends Bar {
println("Hi, I am in class Foo")
}
scala> val foo = new Foo
Pretending to read Bar.properties
Hi, I am in class Foo
foo: Foo = Foo@27d8f985
只要您的资源是全球性的,您就可以轻松获取它们。如果没有,请将它们混合在较早的特征中。
提前初始化怎么样?
trait A {
val f: String
val a = "I would have used " + f
}
trait B {
val f: String
val b = "I would have used " + f + " too!"
}
class C extends { val f = "the string" } with A with B
如果你把它扔到 REPL 中:
scala> List(c.a, c.b).map(println _)
I would have used the string
I would have used the string too!
这是我最终使用的一种更简洁的方法
class Foo( val propertyFile: String ) extends Bar with Baz with Zot
trait Bar extends Properties {
private val something = getProperty("Something")
}
trait Baz extends Properties {
private val somethingElse = getProperty("SomethingElse")
}
trait Zot extends Properties {
private val somethingWeird = getProperty("Something") + getProperty("SomethingElse")
}
trait Properties {
val propertyFile: String
private val properties = readProperties(propertyFile)
protected def getProperty(name: String) = properties.get(name)
}