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 中你可以找到特征
ProductTypeClass
和 ProductTypeClassCompanion
,
LabelledProductTypeClass
和 LabelledProductTypeClassCompanion
.
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是完全不同的,在继承和类型上没有联系,唯一特殊的是他们可以看到彼此的成员。
我是 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 中你可以找到特征
ProductTypeClass
和ProductTypeClassCompanion
,LabelledProductTypeClass
和LabelledProductTypeClassCompanion
.
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是完全不同的,在继承和类型上没有联系,唯一特殊的是他们可以看到彼此的成员。