Scala - как правильно организовать иерархию одиночных объектов? - PullRequest
4 голосов
/ 03 февраля 2012

Вот кое-что, с чем я столкнулся в Scala и не вызвало проблем в Java.Теперь я просто не знаю, как правильно делать это в Scala.

Описание проблемы: у меня есть объект Scala, который обозначает «абстрактный» объект.Предполагается, что он имеет одноэлементный профиль, но не предназначен для реального использования, это просто набор определений, общих для его детей-одиночек.Поэтому вместо этого я хочу использовать это детей.Поэтому возникает вопрос: поскольку я не могу наследовать объекты, должна ли общая функциональность синглтона реализовываться как класс?Как абстрактный класс?Черта меня не устраивает, потому что у нее не может быть конструкторов.Если абстрактный родительский класс подойдет, то как мне получить доступ к его одноэлементным (или статическим) методам, если они мне нужны?Я понимаю, что в моем дизайне может быть недостаток, но, поскольку у меня есть этот вопрос, и я не могу придумать однозначного ответа, интересно услышать, что вы говорите (включая альтернативы дизайна).

Ответы [ 2 ]

7 голосов
/ 03 февраля 2012

Вы действительно должны использовать trait; в конструкторах нет необходимости (и они действительно не имеют смысла, потому что у scala object нет конструктора):

Вот общая черта; needA - это значение , которое необходимо передать конструктору . То есть это требуется по функциональности черты.

trait Common {
  def needA: A

  def sharedMethod { /* implement me*/ }
}

Тогда ваши модули выглядят так:

object Mod1 extends Common {
  val needA = { /* implement me*/ }
}     
object Mod2 extends Common {
  val needA = { /* implement me*/ }
}     

Обратите внимание, что они задают необходимые значения для общей функциональности, используя val для переопределения def

2 голосов
/ 03 февраля 2012

Ваша проблема очень похожа на ту, которая возникает при проектировании сопутствующих объектов в библиотеке коллекции в Scala. Они предпочитают использовать черту комона, которая собирает аналогичные функциональные возможности для своих сопутствующих объектов. Чтобы пойти дальше, взгляните, например, на черту GenericCompanion и ее известные подклассы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...