如果我想要一个表达式的后期初始化,我可以使用一个懒惰的val。但是我可以用什么来做后期副作用初始化?
我想做一些事情,比如在基类中创建菜单栏。菜单的实际内容在API独立特征中最终确定,这些特征被混合到API依赖基类的子类中。早期初始化不起作用,因为有多个val必须在每个子类中进行早期初始化。
另一种方法是创建一个过程并在所有最终子类的构造函数中调用它。但这仍然是不优雅的,而不是干。
编辑:据我所知,我认为Delayed Init不会起作用,因为这会将整个构造函数/初始化代码放入一个延迟的方法中,我只需将其中的一部分放在最后施工过程。
答案 0 :(得分:0)
我不完全确定我的问题是否正确,但也许你可以这样做:
abstract class AbstractFoo {
lazy val menuBar = computeMenuBar
def menuBar: MenuBar
}
class ConcreteFoo extends AbstractFoo {
def menuBar: MenuBar = MenuBar("One", "Two")
}