Scala:强制类层次结构中的方法调用
我有一个ConfigBuilder类的层次结构,这些类具有创建配置实例的角色。我的超类是一个AbstractConfigBuilder,它有一个方法构建。我希望构建总是在实际构建对象之前调用方法validate。所以,在抽象的超类中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
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)
)不,我不明白为什么你认为基类中需要它。