Kotlin抽象类必须具有构造函数并进行初始化

Kotlin抽象类必须具有构造函数并进行初始化,kotlin,Kotlin,当我有这个类层次结构时: 超类 子类 我在子类中得到一个IDE错误,它说: 此类型具有构造函数,因此必须在此处初始化 但是,这难道不与拥有抽象类的整个论点背道而驰吗?我只是不想初始化抽象类您刚刚忘记了类扩展中的(): class Subclass : AbsSuperClass() { override fun someFun() } 您刚刚忘记了类扩展中的(): class Subclass : AbsSuperClass() { override fun someFun()

当我有这个类层次结构时:

超类 子类 我在子类中得到一个IDE错误,它说:

此类型具有构造函数,因此必须在此处初始化


但是,这难道不与拥有抽象类的整个论点背道而驰吗?我只是不想初始化抽象类

您刚刚忘记了类扩展中的
()

class Subclass : AbsSuperClass() {
    override fun someFun()
}

您刚刚忘记了类扩展中的
()

class Subclass : AbsSuperClass() {
    override fun someFun()
}

是的,这将使代码工作,但为什么我要初始化一个抽象超类?这是没有意义的,“抽象”的名称无效抽象类仍然是类,可能有初始化代码。子类必须始终调用超类的构造函数,以确保发生初始化。您不能实例化抽象类,但它仍然表示类行为。好的。这有点违反直觉。不是吗?这对我来说很有意义。毕竟,除非您希望抽象类有一个具体的子类(或子类…),否则编写抽象类是没有意义的。如果具体的子类被实例化,抽象的超类将如何设置自己?(它可能有需要设置的私有内容,它的子类不会看到这些内容。)抽象类可以有相当多的状态和行为,即使它们需要子类来指定更多的状态和行为。(在本例中,它足够简单,可以是一个接口,当然它没有构造函数;但大多数情况都不是那么简单!)想想为什么选择使用抽象类而不是接口。通常,这是因为您需要设置携带状态的属性。要设置它们,必须对它们进行初始化。在您的示例中,抽象类不携带状态。它也可以是一个接口,然后你就不需要调用构造函数了。是的,这会让代码正常工作,但是为什么我要初始化一个抽象超类呢?这是没有意义的,“抽象”的名称无效抽象类仍然是类,可能有初始化代码。子类必须始终调用超类的构造函数,以确保发生初始化。您不能实例化抽象类,但它仍然表示类行为。好的。这有点违反直觉。不是吗?这对我来说很有意义。毕竟,除非您希望抽象类有一个具体的子类(或子类…),否则编写抽象类是没有意义的。如果具体的子类被实例化,抽象的超类将如何设置自己?(它可能有需要设置的私有内容,它的子类不会看到这些内容。)抽象类可以有相当多的状态和行为,即使它们需要子类来指定更多的状态和行为。(在本例中,它足够简单,可以是一个接口,当然它没有构造函数;但大多数情况都不是那么简单!)想想为什么选择使用抽象类而不是接口。通常,这是因为您需要设置携带状态的属性。要设置它们,必须对它们进行初始化。在您的示例中,抽象类不携带状态。它也可以是一个接口,然后您就不需要调用构造函数了。
class Subclass : AbsSuperClass() {
    override fun someFun()
}