Как вы объявляете значения и методы абстрактных объектов в scala? - PullRequest
5 голосов
/ 30 июля 2011

Я хочу указать цвет животных один раз, и он одинаков для всех животных одного и того же вида.

Так что я хотел бы сделать:

abstract object Animal {val color: String}

А затем укажите отдельные цвета животных с помощью

object Dog extends Animal {val color = "green"}

Это должно быть в объекте, так как у меня уже есть соглашение, которое не может быть изменено, только делая животных с фабричным методом, также объявленным в объекте Animal, и фабричным методам нужен доступ к цвету. например,

abstract object Animal {
   val color: String
   def makeAnimal(args): Animal = ...
}

Как мне на самом деле сделать это в Scala, учитывая, что "только классы могут быть объявлены, но неопределенные члены"?

Я могу придумать хакерский способ сделать это, используя черты, но я надеюсь, что есть что-то лучшее.

[EDIT] Так что получается, что я не могу использовать черты для хранения значений / методов по сложным причинам. Текущее решение включает в себя статическую регистрацию дочернего объекта с родительским объектом с использованием признака, и это позволяет мне получить доступ к нетрадиционным значениям и методам, которые должны быть определены в объекте. Я все еще надеюсь на лучшее решение.

1 Ответ

16 голосов
/ 30 июля 2011

Вы не можете продлить object с по определению.Так что да, вам нужна черта, но я не вижу в этом ничего хакерского:

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

object Dog extends AnimalCompanion {
  val color = ...
  def makeAnimal(args) = ...
}

или даже лучше

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 = ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...