Невозможно вызвать функцию из дочернего типа из конструктора - PullRequest
1 голос
/ 16 октября 2019

Можно ли вызвать функцию из дочернего типа из конструктора? Пожалуйста, взгляните на пример

class Dog(animalType: DogType) : Animal(animalType) {
    fun doSomething() {
        animalType.runDogTypeFunction() // error but animalType is always DogType
    }
}

abstract class Animal(val animalType: AnimalType)
interface AnimalType

enum class DogType() : AnimalType {
    DOG1, DOG2;
    fun runDogTypeFunction() {}
}

enum class CatType() : AnimalType {
    CAT1, CAT2;
    fun runCatTypeFunction() {}
}

animalType - это const (val), поэтому это всегда DogType. Я не понимаю, почему я не могу вызвать метод из класса DogType. Я пытался переопределить val, но я получил NPE

1 Ответ

3 голосов
/ 16 октября 2019

Ваша собственность объявлена ​​в базовом классе Animal (как AnimalType). Параметр конструктора в Dog не существует, когда вы вызываете doSomething.

Вы можете попробовать что-то вроде этого:

abstract class Animal<T: AnimalType>(val animalType: T)

class Dog(animalType: DogType) : Animal<DogType>(animalType) {
    fun doSomething() {
        animalType.runDogTypeFunction()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...