Scala - 组织单例对象层次结构的正确方法是什么?

时间:2012-02-03 10:55:34

标签: scala inheritance object singleton

这是我在Scala中遇到的一些不会导致Java出现任何问题的东西。现在我只是不知道在Scala中这样做的正确方法是什么。

问题描述:我有一个Scala对象,它表示一个'抽象'对象。它打算有一个单一的配置文件,但它并不打算用于实际用途,它只是它的儿童单身人士常见的一堆定义。所以相反,我想用它的孩子。所以有一个问题:因为我不能继承对象,是否应该将常见的单例功能实现为类?作为一个抽象类?特质不适合我,因为它不能有构造函数。   如果抽象父类会这样做,那么如果我需要它们,我应该如何访问它的单例(或静态)方法呢?   我意识到我的设计可能存在缺陷,但由于我有这个问题并且无法想出任何明确的答案,所以听到你说的话很有意思(包括设计备选方案)。

2 个答案:

答案 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特征及其已知子类的示例。