Scala:强制类层次结构中的方法调用

Scala:强制类层次结构中的方法调用,scala,inheritance,Scala,Inheritance,我有一个ConfigBuilder类的层次结构,这些类具有创建配置实例的角色。我的超类是一个AbstractConfigBuilder,它有一个方法构建。我希望构建总是在实际构建对象之前调用方法validate。所以,在抽象的超类中 val commonField: String //one of many fields common to all the hierarchy abstract def build: Config //building logic left to the

我有一个ConfigBuilder类的层次结构,这些类具有创建配置实例的角色。我的超类是一个AbstractConfigBuilder,它有一个方法构建。我希望构建总是在实际构建对象之前调用方法validate。所以,在抽象的超类中

val commonField: String    //one of many fields common to all the hierarchy

abstract def build: Config  //building logic left to the subclasses

def validate: Boolean = {
  // here some common checks
  commonField.size > 0
} 
在子类中

val subFiled: String

def build: Config = {
   if(validate)                                            // call to validation
      new ConfigImplementation(commonField, subfield) 
   else throw new Error()
}

def validate: Boolean = {
   super.validate            
   subField.size > 0
}
我想要实现的是避免在超类的每个子类中调用验证。我的行为是明确的和固定的:只有在验证配置的参数(超类中的一些常见参数,子类中的其他参数)之后,才能构建配置。
您能给我建议最好的方法吗?

只需将您的
构建分为两部分:

protected abstract def buildInternal: Config 
def validate: Boolean

final def build: Config = if(validate) buildInternal else throw new Error()

正确的。这是有道理的。如果我有一部分建筑逻辑是内部的呢?我有一个变量“d”,只有在验证之后,它才能在超类中填充。使此变量可用于子类的最佳方法是什么?我可以创建一个“var”并在验证后对其进行更改,但还有其他方法吗?验证应该影响变量的值,只检查当前状态是否一致。如果您需要在
build
期间执行某种中间通用逻辑,只需将其设置为一个函数,返回一个值:
def buildInternal={val d=computeD;buildUsingD(d)}
^我的意思是,“验证不应该影响变量的值”。当然,好的,所以我必须确保
buildUsingD(d)
在main trait/abstract类中定义。这使得这个特性不是很灵活,因为每次我必须向公共逻辑添加内容时,我都必须更改这个方法的签名(例如
buildUsingD(d,e,f)
)不,我不明白为什么你认为基类中需要它。