【发布时间】:2018-10-25 21:34:25
【问题描述】:
我是 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
}
有没有更好的办法?
【问题讨论】:
-
您认为您提出的方法有什么问题?
-
这似乎有点多余,所以我想知道是否还有其他做法,或者是否至少有一些常见的命名约定,因为我不喜欢用“Companion”来命名相应的“companion trait” " 后缀。
标签: scala inheritance companion-object