Ограничение объекта-компаньона Kotlin относительно отражения и наследования

Предполагать:

  • Мне нужно много сопутствующих (статических) методов для подклассов Parent
  • Мне нужно много методов (нестатических) для подклассов Parent
  • У меня есть более 50 подклассов Parent
  • clazz и некоторые другие поля должны вычисляться для каждого класса (не экземпляра) из-за производительности
  • Ожидайте, что методы Companion и не-Companion используют вычисляемые элементы (например: clazz)
  • Последний, но тем не менее важный Parent а также MyCompanion может иметь сложную логику, но подклассы Parent лайк Child должно быть в самой простой форме, насколько это возможно

Вопрос:

как получить правильное имя класса Child в обоих ниже выражениях:

Child().printClass()
Child.printClassUsingCompanion()

Код: ПОПРОБУЙТЕ ЕГО

open class MyCompanion {
  var clazz = this::class.java.declaringClass.name
  // and many more members that will compute using reflection with complex logic
  fun printClassUsingCompanion() = println(clazz)
}

open class Parent {
  companion object : MyCompanion()
  fun printClass() = println(clazz)
}

class Child: Parent() {
  companion object : MyCompanion()
}

fun main() {
  Child().printClass()              //output: Parent
  Child.printClassUsingCompanion()  //output: Child
}

0 ответов

Другие вопросы по тегам