最初的错误是因为数据类在其主构造函数中不能有参数,除了val
or var
特性。删除data
关键字解除了此限制。
有人提到数据类通常不能很好地处理继承。它们应该用作简单的数据传输对象,并且并不真正适合参与层次结构,因为很难理解在生成的方法的实现中将考虑哪些属性。你最好的选择可能是在这里根本不使用它们。
有关数据类和继承的更多信息,here https://github.com/Kotlin/KEEP/blob/master/proposals/data-class-inheritance.md是在 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
继承自的所有类的属性Task
。您还可以更进一步,将属性放入ITask
接口也是如此。
interface ITask {
val targetServer: Server
}