Kotlin sealed class的抽象val赋值,如何简化继承类构造实现?
Kotlin Sealed Class 继承属性初始化简化方案
你的核心需求是保留属性不可变性的前提下,减少sealed class抽象属性在子类中重写的冗余代码,以下是可落地的实现方案:
方案1:改用主构造函数直接声明重写属性
Kotlin 主构造函数支持直接用override val声明父类抽象属性的重写,不需要额外写属性赋值代码,是最简洁的实现方式:
sealed class Animal { abstract val object1 : SomeObject abstract val object2 : SomeObject2 abstract val object3 : SomeObject3 abstract val object4 : SomeObject4 } // 主构造直接完成属性重写,无需冗余的单独声明 abstract class GrassEaterAnimal( override val object1: SomeObject, override val object2: SomeObject2, override val object3: SomeObject3, override val object4: SomeObject4, val func: (field1, field2) -> Foo ) : Animal
方案2:封装公共属性减少传参冗余
如果有多个子类都需要重写这4个公共属性,可以把它们封装为独立的配置类,进一步减少所有子类的构造参数数量,后续新增公共字段也不需要修改所有子类的构造:
// 封装所有公共属性为配置数据类 data class AnimalConfig( val object1: SomeObject, val object2: SomeObject2, val object3: SomeObject3, val object4: SomeObject4 ) sealed class Animal { abstract val config: AnimalConfig // 内部添加代理属性,外部调用时不需要额外访问config val object1 get() = config.object1 val object2 get() = config.object2 val object3 get() = config.object3 val object4 get() = config.object4 } abstract class GrassEaterAnimal( override val config: AnimalConfig, val func: (field1, field2) -> Foo ) : Animal // 子类实例化示例 class Rabbit(config: AnimalConfig, func: (field1, field2) -> Foo) : GrassEaterAnimal(config, func)
方案3:多构造场景兼容方案
如果确实需要多个构造函数满足不同初始化场景,可以把公共属性的重写放在主构造,次构造仅处理差异化参数:
abstract class GrassEaterAnimal( override val object1: SomeObject, override val object2: SomeObject2, override val object3: SomeObject3, override val object4: SomeObject4, val func: (field1, field2) -> Foo ) : Animal { // 次构造适配无func的场景,主构造保留属性重写逻辑 constructor( object1: SomeObject, object2: SomeObject2, object3: SomeObject3, object4: SomeObject4 ) : this(object1, object2, object3, object4, { _, _ -> 默认实现 }) }
以上方案均保留了属性的不可变性,不需要使用lateinit var。
内容的提问来源于stack exchange,提问作者user2498079
相关产品推荐
相关产品推荐

