gpt4 book ai didi

java - 使用主构造函数继承类

转载 作者:IT老高 更新时间:2023-10-28 13:46:41 25 4
gpt4 key购买 nike

我有一个父类如下,

interface ITask { }

open class Task(val targetServer: Server) : ITask { }

然后有一个子继承它并覆盖主构造函数,如下所示,

data class FileTask(val sourceServer: Server, targetServer: Server) : Task(targetServer = targetServer) {

}

这是在eclipse中抛出编译错误

Data class primary constructor must have only property (val / var) parameters

从类头中删除 data 关键字会杀死错误,但我不明白为什么。

保留 data 关键字并将 var 添加到 targetServer 会产生另一个错误

'targetServer' hides member of supertype 'Task' and needs 'override' modifier

override 添加到 targetServeroverride var targetServer: Server 会引发另一个错误

'targetServer' in 'Task' is final and cannot be overridden

我需要一些帮助来理解这些错误。

最佳答案

最初的错误是因为数据类在其主构造函数中不能有参数,除了 valvar 属性。删除 data 关键字会解除此限制。

有人提到,数据类通常不能很好地处理继承。它们应该用作简单的数据传输对象,并不真正适合参与层次结构,因为很难理解在生成的方法的实现中将考虑哪些属性。您最好的选择可能是在这里根本不使用它们。

有关数据类和继承的更多信息,here是在 Kotlin 1.1 中实现的提案。


回到具体问题,如果真的要让这个类成为数据类,可以将基类中的属性标记为open,然后在FileTask中覆盖,像这样:

open class Task(open val targetServer: Server) : ITask

data class FileTask(val sourceServer: Server, override val targetServer: Server): Task(targetServer = targetServer)

这基本上隐藏了Task中声明的属性,而总是访问FileTask中的属性。

我不知道你对你的类的确切要求是什么,但你可以做的一件事是清理它并让它变得更好一点,那就是制作 Task 及其 targetServer 属性抽象,像这样:

abstract class Task : ITask {
abstract val targetServer: Server
}

data class FileTask(val sourceServer: Server, override val targetServer: Server) : Task()

这样您就不会在基类中拥有不必要的属性(和支持字段),并且您将被迫在从 继承的所有类中拥有 targetServer 属性>任务。您还可以更进一步,将该属性也放入 ITask 接口(interface)中。

interface ITask {
val targetServer: Server
}

关于java - 使用主构造函数继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com