如何在scala中声明抽象对象值和方法?

wn-*_*wn- 5 scala

我想指定一次动物颜色,并且对于同一物种的所有动物都是相同的.

所以我想做:

abstract object Animal {val color: String}
Run Code Online (Sandbox Code Playgroud)

然后用个别动物指定颜色

object Dog extends Animal {val color = "green"}
Run Code Online (Sandbox Code Playgroud)

这需要在对象中,因为我已经有了一个不能更改的约定,只能在Animal对象中声明使用工厂方法生成动物,并且工厂方法需要访问颜色.例如

abstract object Animal {
   val color: String
   def makeAnimal(args): Animal = ...
}
Run Code Online (Sandbox Code Playgroud)

我如何在scala中实际执行此操作,因为"只有类可以声明但未定义的成员"?

我可以想到一种使用特征来做这个的hacky方法,但我希望有更好的东西.

[编辑]所以事实证明,由于复杂的原因,我无法使用特征来保存值/方法.当前解决方案涉及使用特征静态地向父对象注册子对象,这允许我访问必须在对象中定义的非特征值和方法.我仍然希望有更好的解决方案.

Ale*_*nov 16

object根据定义,您无法扩展s.所以,是的,你需要一个特质,但我没有看到任何关于这个的hacky:

trait AnimalCompanion {
  val color: String
  def makeAnimal(args): Animal // if you have same args everywhere
}

object Dog extends AnimalCompanion {
  val color = ...
  def makeAnimal(args) = ...
}
Run Code Online (Sandbox Code Playgroud)

甚至更好

trait AnimalCompanion[A <: Animal] {
  val color: String
  def makeAnimal(args): A
}

class Dog extends Animal

object Dog extends AnimalCompanion[Dog] {
  val color = ...
  def makeAnimal(args): Dog = ...
}
Run Code Online (Sandbox Code Playgroud)