Ограничение объекта-компаньона 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
}