Укажите подкласс при объявлении абстрактного класса - PullRequest
0 голосов
/ 03 ноября 2019

версия kotlin: 1.3.50

В примере кода я хочу использовать метод compareTo для сравнения только между экземплярами того же подкласса, например, dog сравнивается только с dog.

Я думаю, было бы лучше, если бы compareTo принимал только подкласс, но Animal. Но я не знаю, как это сделать. Есть хорошая идея?

abstract class Animal{
    abstract fun compareTo(other: Animal)
    // I want to implement like `abstract fun compareTo(other: this::class)`
}

class Dog: Animal(){
    override fun compareTo(other: Animal) {
        assert(other is Dog)
        // do something
    }
}

class Cat: Animal(){
    override fun compareTo(other: Animal) {
        assert(other is Cat)
        // do something
    }
}

1 Ответ

0 голосов
/ 03 ноября 2019

Вы должны добавить параметр ссылающегося на себя типа в Animal class:

abstract class Animal<SELF : Animal<SELF>> {
    abstract fun compareTo(other: SELF): Int
}

Теперь вы можете расширить его следующим образом:

class Dog : Animal<Dog>() {
    override fun compareTo(other: Dog): Int {
        // do something
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...