这是我在Scala中遇到的一些不会导致Java出现任何问题的东西。现在我只是不知道在Scala中这样做的正确方法是什么。
问题描述:我有一个Scala对象,它表示一个'抽象'对象。它打算有一个单一的配置文件,但它并不打算用于实际用途,它只是它的儿童单身人士常见的一堆定义。所以相反,我想用它的孩子。所以有一个问题:因为我不能继承对象,是否应该将常见的单例功能实现为类?作为一个抽象类?特质不适合我,因为它不能有构造函数。 如果抽象父类会这样做,那么如果我需要它们,我应该如何访问它的单例(或静态)方法呢? 我意识到我的设计可能存在缺陷,但由于我有这个问题并且无法想出任何明确的答案,所以听到你说的话很有意思(包括设计备选方案)。
答案 0 :(得分:7)
你真的应该使用trait
;不需要构造函数(事实上,它们没有任何意义,因为scala object
没有构造函数):
这是共享特征; needA
是您需要传递给构造函数的值。也就是说,特征的功能需要它。
trait Common {
def needA: A
def sharedMethod { /* implement me*/ }
}
然后你的模块看起来像这样:
object Mod1 extends Common {
val needA = { /* implement me*/ }
}
object Mod2 extends Common {
val needA = { /* implement me*/ }
}
请注意,他们使用val
覆盖def
答案 1 :(得分:2)
您的关注与scala中集合库中的伴随对象设计中出现的问题非常相似。
他们选择使用caommon特性为其伴侣对象收集类似的功能。为了更进一步,请查看GenericCompanion
特征及其已知子类的示例。