在密封类中为抽象 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 赋值的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中为变量属性赋值的 Objective C 语法

JAVA中静态变量如何动态赋值?

如何在一种方法中为数组赋值并从另一种方法调用

jqc#零基础学习之路抽象类和密封

201803280002

12. 抽象与密封