当前位置: 首页 > 知识库问答 >
问题:

Kotlin使用多个构造函数向子类添加val字段

羊舌旭尧
2023-03-14

我在Android中创建一个自定义视图,我想添加一个val字段到构造函数,但是View包含多个构造函数。

class CustomView : View {

    // I want a `val field: CustomField` in my constructor

    constructor(
        context: Context
    ) : super(context)

    constructor(
        context: Context,
        attrs: AttributeSet? = null
    ) : super(context, attrs)

    constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyle: Int = 0
    ) : super(context, attrs, defStyle)

    ...
}

Kotlin不允许在二级构造函数中使用val字段,因此我无法执行以下操作:

class CustomView : View {

    constructor(
        val field: CustomField,
        context: Context
    ) : super(context)

    constructor(
        val field: CustomField,
        context: Context,
        attrs: AttributeSet? = null
    ) : super(context, attrs)

    constructor(
        val field: CustomField,
        context: Context,
        attrs: AttributeSet? = null,
        defStyle: Int = 0
    ) : super(context, attrs, defStyle)

    ...

如何向构造函数添加val字段,但仍然扩展父类的多个构造函数?

  • 我尝试过将val添加到辅助构造函数,但是静态编程语言不允许在辅助构造函数上使用val。
  • 我尝试过创建一个主构造函数(我计划显式使用的那个)并忽略其他构造函数。然后Android Studio给了我一个林特警告,说我缺少构造函数。(我想知道是否有办法实现它们)
  • 我尝试在辅助构造函数(不是val)中添加我想要的字段作为另一个参数,并在辅助构造函数主体中设置它。这导致编译器抱怨说,如果我试图在初始化块中访问,val没有初始化,然后Linter仍然抱怨我没有实现超级构造函数
class CustomView : View {

    val field: CustomField

    constructor(
        field: CustomField,
        context: Context
    ) : super(context) { this.field = field }

    ...
  • 如果我想要的val是一个基元类型,我可以把它作为视图属性集的一部分传递,但是在这种情况下它不是。如果存在的话,我也希望有一个通用的静态编程语言解决方案。

共有1个答案

曾丰茂
2023-03-14

你可以这样做。

您将得到错误属性必须初始化或抽象,因为必须在类的每个构造函数中初始化字段myCustomField

此外,您不能在参数中使用关键字val

    class CustomView : View {

        val myCustomField : CustomField

        constructor(customField : CustomField, context: Context?) : super(context){
            this.myCustomField = customField
        }

        constructor(customField : CustomField ,context: Context?, attrs: AttributeSet?) : super(context, attrs){
            this.myCustomField = customField

        }
        constructor(customField : CustomField, context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
            context,
            attrs,
            defStyleAttr
        ){
            this.myCustomField = customField
        }

        constructor(
            customField : CustomField,
            context: Context?,
            attrs: AttributeSet?,
            defStyleAttr: Int,
            defStyleRes: Int
        ) : super(context, attrs, defStyleAttr, defStyleRes){
            this.myCustomField = customField
        }
    } 
 类似资料:
  • 以下作品 而这不是(未解决的引用:tabCount) 我是Kotlin的新手,只是不明白为什么不能在类本身中使用val属性。有人能解释一下吗?谢谢

  • 我是新手。我想在Person类驱动的Employee类中添加age参数。我怎么能在科特林做到?! 我的错误是这样的: 为什么不能在员工构造函数中使用var或val?!我犯了什么错误?

  • 请帮我从这段代码中查找错误。我还是新手,我不知道这是否正确。我确实有一个错误。这就是错误:类Person中的构造函数Person不能应用于给定类型;super();^requiredent:String,String,String找到:没有参数原因:实际和正式参数列表长度不同这是我的代码: 编辑:如果我对Person和Address类都这样做。我只能有三个ARG构造函数。如何调用one-arg构造

  • 我知道数据类就像kotlin中的简单模型一样,默认情况下带有getter和setter,并且非常简单: 是否可以为该数据类声明第二个构造函数?

  • 我有以下课程: 但当我想让name参数在第二个构造函数中不可变时: 我有以下编译时错误: 不允许在辅助构造函数参数上使用Kotlin:“val” 有人能解释为什么Kotlin编译器不允许这样做吗?

  • 我正在做一项关于使用结构化/半结构化/非结构化数据的作业,我正在对莎士比亚的戏剧进行字数统计(以了解语言如何随时间变化),方法是导入每部戏剧的txt文件和xml索引文件,该文件存储有关每部戏剧的关键信息,如编写年份、角色列表等。。然后,我将删除字符名、设置、标点符号和常用词(和、但、或,如果等…)从txt文件准备好进行字数统计-全部在C#中运行的控制台脚本中。我正在编写一个类,每个剧本的数据都将存