2015-11-30 29 views
0

我运行到下面的一段代码:为什么在Scala中为var分配默认值可防止编译错误?

abstract class CommonThing { 
    var lookupTable: Map[String, Double] = _ 

    // .... 
    // sets up base configurations 
} 

class FinalThing extends CommonThing { 
    // generates actual production data 
} 

如果我删除默认的分配LookupTable中,我得到一个编译错误说FinalThing应该实现lookupTable。但是,它没有被FinalThing使用。

为什么我得到这个错误,并且有没有更好的方法来编码这个,所以我不需要在基础'lookupTable'中添加默认值?

回答

3

这是因为如果scala var字段没有实现,则它们被认为是抽象的。如果您在中忽略lookupTable的实现,那么lookupTable被认为是抽象的,并且需要在FinalThing中实现,因为它是具体的(而不是抽象的)类。

1

如果FinalThing没有使用lookupTable这意味着在您的类层次结构设计中存在问题。

这里是一个企图给一个更好的解决方案(警告:我不知道你正在尝试这样做,这可能是相当关闭):

trait CommonThingsBase { 
    // .... 
    // sets up base configurations 
} 

trait LookUpTableLogic { 
    var lookupTable: Map[String, Double] 
} 

abstract class CommonThing extends CommonThingsBase with LookUpTableLogic { 
    var lookupTable: Map[String, Double] = _ 
    // Code that uses the lookupTable 
} 

class FinalThing extends CommonThingsBase { 
    // generates actual production data 
} 
相关问题