Scala适用于没有参数

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,LetterBLetterC

Eug*_*nev 6

回答你的问题是不,你不能区分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)