Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 关于反射和继承的Kotlin伴生对象限制_Inheritance_Kotlin_Reflection_Kotlin Companion - Fatal编程技术网

Inheritance 关于反射和继承的Kotlin伴生对象限制

Inheritance 关于反射和继承的Kotlin伴生对象限制,inheritance,kotlin,reflection,kotlin-companion,Inheritance,Kotlin,Reflection,Kotlin Companion,假设: 对于Parent 对于Parent 我有50多个子类的Parent clazz和一些其他字段由于性能原因必须按类(而不是实例)计算 期望伴随方法和非伴随方法使用计算成员(例如:clazz) 最后但并非最不重要的一点Parent和MyCompanion可能具有复杂的逻辑,但Parent的子类,如Child应尽可能采用最简单的形式 问题: 如何在以下两个表达式中检索子级的正确类名: Child().printClass() Child.printClassUsingCompanion()

假设:

  • 对于
    Parent
  • 对于
    Parent
  • 我有50多个子类的
    Parent
  • clazz
    和一些其他字段由于性能原因必须按类(而不是实例)计算
  • 期望伴随方法和非伴随方法使用计算成员(例如:
    clazz
  • 最后但并非最不重要的一点
    Parent
    MyCompanion
    可能具有复杂的逻辑,但
    Parent
    的子类,如
    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
}