(Kotlin)如何将数据类构造函数的参数传递给超类构造函数?

4

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

我有一个扩展抽象类的data class。(DataClass

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

以下方法行不通,因为数据类构造函数只允许使用valvar
data class DataClass(privateVal: Int) : SuperClass(privateVar)


这个回答解决了你的问题吗?在Kotlin中扩展数据类 - Vadzim
1个回答

6

数据类与普通类不同。正如您已经注意到的那样,数据类要求构造函数中包含属性。数据类和继承之间存在困难,因为您无法像普通类那样传递值。而且,无法从数据类继承;它们不支持openabstract,这意味着它是final的,不能继承。

如果子类是数据类,则无法有效地实现继承:

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

然而,Kotlin确实支持抽象的varval。但如果您绝对需要一个数据类作为子类(虽然我不建议这样做;根据您的使用情况,使用普通类可能更好)。

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

这里覆盖了构造函数中的val,意味着它仍然可以工作。之所以使用protected而不是private是因为如果使用private,它将无法被继承。

但我还是强烈建议在这里使用常规类,而不是数据类。


啊,我没有考虑到protected,我并不经常创建超类。谢谢! - user2851108
我需要使用数据类的copy()函数。 - user2851108

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接