在密封类中为抽象 val 赋值
Posted
技术标签:
【中文标题】在密封类中为抽象 val 赋值【英文标题】:Assigning abstract val a value in sealed class 【发布时间】:2022-01-03 20:01:56 【问题描述】:我有一个密封类,几个抽象类继承自该类。由于密封类中有一堆字段需要在抽象类中初始化,我试图将其移至辅助构造函数,但是辅助构造函数不允许我们声明 override val
字段以使代码多一点简洁的。
我能想到的唯一其他方法是创建字段lateinit var
,但随后我失去了不变性。
sealed class Animal
abstract val object1 : SomeObject
abstract val object2 : SomeObject2
abstract val object3 : SomeObject3
abstract val object4 : SomeObject4
abstract class GrassEaterAnimal : Animal
//trying to do this
constructor(override val object1 : SomeObject, override val object2 : SomeObject2, override val object3 : SomeObject3, override val object4 : SomeObject4, func : (field1, field2) -> Foo)
有没有办法让这段代码更简洁,或者有什么其他建议可以帮助解决这种情况?
【问题讨论】:
您在“抽象”之后缺少关键字“类”。 最后一个func
参数在那里做什么?
谢谢。我会添加它:)
为什么不使用主构造函数?
如果有人调用GrassEaterAnimal
的主构造函数怎么办?这些字段将被初始化为什么?
【参考方案1】:
您可以在主构造函数中实现/初始化属性:
abstract class GrassEaterAnimal(
override val object1: SomeObject,
override val object2: SomeObject2,
override val object3: SomeObject3,
override val object4: SomeObject4,
) : Animal()
【讨论】:
是的,这是我试图避免让它看起来更干净的东西。 二级构造器比一级构造器干净吗? 我的印象是,您只是不喜欢 Kotlin 中主构造函数的语法,并且希望通过使用辅助构造函数来避免这种情况。如果是这种情况,那么不,您不能轻易使用辅助构造函数来替代主构造函数。 感谢各位的建议。任何建议通过做一些lateinit val
解决方案使其更清洁,因为我们在 kotlin 中也没有这种能力:/
这个答案是最干净的解决方案,并且绝对比您在原始问题中建议的语法更干净。看来您对“干净”的含义有不同的概念。多个构造函数不如单个主构造函数干净。 lateinit
在某些情况下总是不太干净,而且不幸的是。以上是关于在密封类中为抽象 val 赋值的主要内容,如果未能解决你的问题,请参考以下文章