首页 > 解决方案 > 多构造函数超类型的 Kotlin 继承

问题描述

我正在尝试继承 JFrame 类。它说“这种类型有一个构造函数,因此必须在这里初始化”所以我不能写:

class MainFrame : JFrame

但:

class MainFrame() : JFrame()

由于我被迫声明一个主构造函数,我不能这样做:

constructor(title: String) : super(title)

我必须这样做:

constructor(title: String) : this(title)

所以我必须以这种方式声明主构造函数:

class MainFrame(title: String) : JFrame(title)

问题是这样每个辅助构造函数都需要调用主构造函数,然后是选择的超类型构造函数。如果我有多个超类型构造函数,我不得不将过程委托给单个超类型构造函数,如果超类型类有许多用于多种目的的构造函数,这可能会很不方便。

有什么方法可以创建一个具有多个调用不同超类型构造函数的构造函数的类?

编辑:

我不能像这样删除超类型构造函数:

class MainFrame : JFrame

如果我这样做了,我会得到这个错误: 这种类型有一个构造函数,因此必须在这里初始化

解决方案:

缺少构造函数,但它可以是辅助构造函数,因此错误:

这种类型有一个构造函数,因此必须在这里初始化

可以通过仅添加辅助构造函数来解决。

标签: kotlin

解决方案


没有必要在类定义中使用主构造函数。您可以简单地省略它,然后您的所有“辅助”构造函数都不必调用主构造函数,而是可以调用相关的超级构造函数。

class MainFrame: JFrame {
    constructor() : super() {

    }

    constructor(title: String) : super(title) {

    }
}

然而,JFrame 确实遵循在 Java 中具有非官方主构造函数的模式,因此您可以将其作为主构造函数调用并使用它使用的相同默认值:

class MainFrame(title: String = "", gc: GraphicsConfiguration? = null): JFrame(title, gc) {

}

推荐阅读