我有一个抽象类:abstract class SuperClass(private val privateVal: Int)
我有一个扩展抽象类data class
。 (DataClass
(
如何将privateVal
作为DataClass
构造函数中的参数并将其传递给SuperClass
构造函数?
以下内容不起作用,因为数据类构造函数中只允许使用val
s 和var
:data class DataClass(privateVal: Int) : SuperClass(privateVar)
数据类的工作方式与常规类不同。正如您已经注意到的,数据类需要构造函数中的属性。数据类和继承很难,因为不能像在常规类中那样传递值。从数据类继承也是不可能的;他们不支持open
或abstract
,这意味着它是最终的,不能从中继承。
实际上,如果您将数据类作为子类,则这是不可能的:
class Something(something: Int, else: Int) : Parent (something, else)
但是,Kotlin 确实支持抽象var
s 和val
s。如果你绝对需要一个数据类作为子类(尽管我不建议这样做;使用常规类可能会更好,具体取决于你的用例(。
abstract class SuperClass {
protected abstract val privateVal: Int
}
data class Overridden(override val privateVal: Int) : SuperClass()
在这里,它覆盖了构造函数中的 val,这意味着它仍然可以工作。它之所以protected
而不是private
,是因为如果它是private
,它将无法继承。
同样,我真的建议在这里使用常规类而不是数据类。