如何在 Kotlin 中继承 MutableList?

iFo*_*sts 5 kotlin

我正在尝试继承 MutableList,并向其中添加我自己的函数。例如:

class CompositeJob : MutableList<Job> {
    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

类“CompositeJob”不是抽象的,也没有实现抽象成员
public abstract val size: Int 在 kotlin.collections.MutableList 中定义

我如何继承 MutableList,以便我可以使用它的原始方法,如 add() 和 isEmpty(),并添加我自己的方法?

谢谢。

zsm*_*b13 7

MutableList是一个接口——它不实现它的任何方法,只是声明它们。如果你想MutableList从头开始实现,你必须实现它的所有 20 个方法和size属性,正如你的错误已经告诉你的那样。

但是,您可以子类化此接口的实际实现,例如ArrayListLinkedList

class CompositeJob : ArrayList<Job>() {
    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您只是想对协程Job实例进行分组,则此时应该使用 parent Job、 aSupervisorJobCoroutineScope,而不是手动收集这样的作业。


Ale*_*nov 7

其他答案没有提到的一种选择是委托

class CompositeJob : MutableList<Job> by mutableListOf() {
    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上相当于

class CompositeJob : MutableList<Job> {
    private val impl: MutableList<Job> = mutableListOf()
    override fun size() = impl.size()
    override fun add(x: Job) { impl.add(x) }
    // etc for all other MutableList methods

    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)