Предположим:
- Мне нужно много сопутствующих (статических) методов для подклассов
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
}