Как наследовать MutableList в Котлине? - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь унаследовать MutableList и добавить к нему свою собственную функцию. Например:

class CompositeJob : MutableList<Job> {
    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}

Но я получил следующую ошибку:

Класс 'CompositeJob' не является абстрактным и не реализует абстрактный член
публичный абстрактный размер val: Int, определенный в kotlin.collections.MutableList

Как я могу наследовать MutableList, чтобы я мог использовать его оригинальные методы, такие как add () и isEmpty (), и добавить свой собственный?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Один вариант, который другие ответы не упоминают: делегирование :

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

в основном эквивалентно

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()
        }
    }
}
0 голосов
/ 06 июля 2018

MutableList - это интерфейс - он не реализует ни один из своих методов, просто объявляет их. Если вы хотите реализовать MutableList с нуля, вам придется реализовать все 20 его методов плюс свойство size, как уже говорилось в вашей ошибке.

Однако вы можете подклассить фактические реализации этого интерфейса, например, ArrayList или LinkedList:

class CompositeJob : ArrayList<Job>() {
    fun cancelAllJobs() {
        for (job in this) {
            job.cancel()
        }
    }
}
0 голосов
/ 06 июля 2018

Реализация всех участников - не единственный способ достичь того, что вам нужно.
Проще всего создать такую ​​функцию расширения:

fun MutableList<Job>.cancelAllJobs() {
    this.forEach { it.cancel() }
} 

Теперь вы можете вызывать myList.cancelAllJobs() для каждого MutableList<Job> объекта.

0 голосов
/ 06 июля 2018

Как я уже проверял, вам нужно сделать CompositeJob abstract, так как ошибка также подсказывает. После этого вы можете переопределить add() и isEmpty() с MutableList

Ваш код выглядит следующим образом:

abstract class CompositeJob : MutableList<Job> {
override fun add(element:Job): Boolean
  {

  }

override fun isEmpty(): Boolean 
     {

     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...