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

时间:2018-10-11 12:24:59

标签: scala inheritance companion-object

我对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 :(得分:0)

例如在Shapeless中,您可以找到特征

  • ProductTypeClassProductTypeClassCompanion

  • LabelledProductTypeClassLabelledProductTypeClassCompanion

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

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

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