我对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
}
有更好的方法吗?
答案 0 :(得分:0)
例如在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完全不同,并且在继承和类型的意义上没有联系,唯一的区别是它们可以看到彼此的成员。