Scala:晚期效应初始化

时间:2014-05-11 12:07:35

标签: scala

如果我想要一个表达式的后期初始化,我可以使用一个懒惰的val。但是我可以用什么来做后期副作用初始化?

我想做一些事情,比如在基类中创建菜单栏。菜单的实际内容在API独立特征中最终确定,这些特征被混合到API依赖基类的子类中。早期初始化不起作用,因为有多个val必须在每个子类中进行早期初始化。

另一种方法是创建一个过程并在所有最终子类的构造函数中调用它。但这仍然是不优雅的,而不是干。

编辑:据我所知,我认为Delayed Init不会起作用,因为这会将整个构造函数/初始化代码放入一个延迟的方法中,我只需将其中的一部分放在最后施工过程。

1 个答案:

答案 0 :(得分:0)

我不完全确定我的问题是否正确,但也许你可以这样做:

abstract class AbstractFoo {

  lazy val menuBar = computeMenuBar

  def menuBar: MenuBar

}

class ConcreteFoo extends AbstractFoo {

  def menuBar: MenuBar = MenuBar("One", "Two")

}