Scala - дублированная иерархия для сопутствующего объекта - PullRequest
0 голосов
/ 11 октября 2018

Я довольно новичок в Scala, и мне было интересно, как лучше организовать иерархию для классов и их сопутствующих объектов.

Предположим, у меня есть базовый класс или интерфейс, который я хочурасширить.В Python я бы сделал что-то вроде этого:

class Base(object):
    def an_instance_method(self):
        return 0

    @classmethod
    def a_class_method(cls):
        return 1

    def another_instance_method(self):
        raise NotImplentedError()

    @classmethod
    def another_class_method(cls):
        raise NotImplementedError()

class A(Base):
    def another_instance_method(self):
        return self.an_instance_method() + 1

    @classmethod
    def another_class_method(cls):
        return cls.a_class_method() + 1

class B(Base):
    def another_instance_method(self):
        return self.an_instance_method() + 2

    @classmethod
    def another_class_method(cls):
        return cls.a_class_method() + 2

Мое текущее решение Scala следующее:

trait Base {
  def an_instance_method(): Int = 0
  def another_instance_method(): Int
}

trait BaseCompanion {
  def a_class_method(): Int = 1
  def another_class_method(): Int
}

class A extends Base {
  override def another_instance_method(): Int = an_instance_method() + 1
}
object A extends BaseCompanion {
  override def another_class_method(): Int = a_class_method() + 1
}

class B extends Base {
  override def another_instance_method(): Int = an_instance_method() + 2
}
object B extends BaseCompanion {
  override def another_class_method(): Int = a_class_method() + 2
}

Есть ли лучший способ?

1 Ответ

0 голосов
/ 12 октября 2018

Например, в Shapeless вы можете найти черты

  • ProductTypeClass и ProductTypeClassCompanion,

  • LabelledProductTypeClass и LabelledProductTypeClassCompanion.

https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/typeclass.scala

Так что я думаю, что иерархия именования и организации в порядке, хотя вы не предоставляете подробности того, как вы используете связь между классом A и объектом A, классомB и объект B. Теперь они кажутся независимыми, поэтому объект A теперь не обязательно может быть сопутствующим объектом класса A и просто некоторым объектом A1.

На самом деле я не думаю, что это избыточно, поскольку эти две иерархии - две разные.Класс A и его сопутствующий объект A совершенно разные и не связаны в смысле наследования и типизации, единственное, что они могут видеть члены друг друга.

...