Scala - 伴随对象的重复层次结构

Scala - duplicated hierarchy for companion object

我是 Scala 的新手,我想知道哪种是组织 classes 及其伴随对象的层次结构的最佳方式。

假设我有一个要扩展的基础 class 或接口。在 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
}

有没有更好的方法?

例如在 Shapeless 中你可以找到特征

  • ProductTypeClassProductTypeClassCompanion,

  • LabelledProductTypeClassLabelledProductTypeClassCompanion.

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

所以我想命名和组织层次结构是可以的,尽管您没有提供详细信息如何使用 class A 和对象 A、class B 和对象 B 之间的连接。现在他们似乎是独立的,因此对象 A 现在不一定是 class A 的伴随对象,而只是某个对象 A1。

实际上我不认为这是多余的,因为这两个层次结构是两个不同的层次结构。 ClassA和它的伴生对象A是完全不同的,在继承和类型上没有联系,唯一特殊的是他们可以看到彼此的成员。