Gol*_*ein 3 scala subclass apply
我想创建一个在请求时生成随机内容的程序,例如下面示例中的字母.我已经定义了一个带有伴随对象的抽象类来返回其中一个子类.
abstract class Letter
class LetterA extends Letter {
override def toString = "A"
}
class LetterB extends Letter {
override def toString = "B"
}
class LetterC extends Letter {
override def toString = "C"
}
object Letter {
def apply = RNG.d(3) match {
case 1 => new LetterA
case 2 => new LetterB
case 3 => new LetterC
}
override def toString = "Random Letter"
}
Run Code Online (Sandbox Code Playgroud)
我的梦想是,我将能够使用LetterA,B或C类型的随机字母.但是使用这段代码,它只是给了我一个字母对象.Letter.apply给我A,B或C但是很难看.
如果我改变了apply函数apply()那么事情会好一点,因为我可以用它Letter()来获取我的随机字母,但Letter仍然给了我这个对象.
有什么我可以这么做的,分配一些东西Letter实际上解决其中之一LetterA,LetterB或LetterC?
回答你的问题是不,你不能区分Letter.type和Letter.apply,所以你需要一个解决方法.
我建议你使用Type-Class模式,它比将随机生成的apply方法添加到伴侣对象要宽泛得多
trait RandomGenerator[T] {
def gen: T
}
implicit object RandomLetter extends RandomGenerator[Letter] {
private val rnd = new Random()
def gen = (rnd.nextInt(3) + 1) match {
case 1 => new LetterA
case 2 => new LetterB
case 3 => new LetterC
}
}
def random[T: RandomGenerator]: T =
implicitly[RandomGenerator[T]].gen
println(random[Letter])
println(random[Letter])
println(random[Letter])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |