inheritance - (Kotlin)将参数从数据类构造函数传递给 super 构造函数?

标签 inheritance constructor kotlin superclass data-class

我有一个抽象类:
抽象类 SuperClass(private val privateVal: Int)

我有一个扩展抽象类的数据类。 (数据类)

如何将 privateVal 作为 DataClass 构造函数中的参数并将其传递给 SuperClass 构造函数?

以下将不起作用,因为在数据类构造函数中只允许使用 valvar:
数据类 DataClass(privateVal: Int) : SuperClass(privateVar)

最佳答案

数据类的工作方式与常规类不同。正如您已经注意到的,数据类需要构造函数中的属性。数据类和继承很难,因为您不能像在常规类中那样传递值。从数据类继承也是不可能的;它们不支持 openabstract,这意味着它是最终的,不能从中继承。

实际上,如果您有一个数据类作为子类,这是不可能的:

class Something(something: Int, else: Int) : Parent (something, else)

但是,Kotlin 支持抽象的 varval。如果您绝对需要一个数据类作为 child (尽管我不建议这样做;根据您的用例,使用常规类可能会更好)。

abstract class SuperClass {
    protected abstract val privateVal: Int
}
data class Overridden(override val privateVal: Int) : SuperClass()

在这里它覆盖了构造函数中的 val,这意味着它仍然可以工作。它是 protected 而不是 private 的原因是因为如果它是 private 就不能继承。

不过,我真的建议在这里使用常规类而不是数据类。

关于inheritance - (Kotlin)将参数从数据类构造函数传递给 super 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52791672/

相关文章:

javascript defineProperty 使属性不可枚举

Kotlin 类型别名与 Android Room TypeConverters

python - 两个呈现的类之间有什么区别?他们的工作方式不同吗?

c++ - 类(class)友元——一个谜

java - 不理解定义构造函数的 Java 语法

c++ - 复制构造函数不调用

java - 在 Java 的子类中专门化方法参数

java - C++抽象类的多重继承

kotlin - 如何用 Anko 屏蔽密码?

kotlin - 如何使用翻新从JSON获取键值