Kotlin中内部类继承外部类时访问外部类实例的方法
解决Kotlin内部类中访问外部子类实例的问题
首先得理清这里的this指向误区:你之前认为this@A指向B继承的父类A实例,其实这是混淆了内部类的外部实例和子类的父类实例的区别。
在你的代码结构里:
B是A的inner类,所以每个B实例都会持有一个外部A类的引用(也就是创建它的那个A子类实例,这里就是Parent)- 同时
B又继承了A,所以B自身也是A的子类实例
Kotlin中用this@类名来区分不同上下文的this:
this(或this@B):指向当前B(也就是Child)的实例this@A:指向B作为内部类时的外部A实例,也就是你要找的Parent对象- 如果要访问
B继承的父类A的成员/实例,应该用super(比如super.toString()会调用A的默认toString)
所以修改测试代码,把this替换成this@A就能实现需求:
abstract class A { abstract inner class B : A() { init { println("Should display 'Parent': ${this@A}") // 替换为this@A } } } class Parent : A() { override fun toString() = "Parent" inner class Child() : B() { override fun toString() = "Child" } } fun main() { Parent().Child() }
运行这段代码会输出:Should display 'Parent': Parent,完全符合预期。
为什么这个写法有效?因为Child是Parent的内部类,当你创建Parent().Child()时,Child实例的外部Parent实例会被传递给它所继承的B类,而B作为A的内部类,this@A就指向这个外部的Parent实例,又因为Parent重写了toString()方法,所以会打印出Parent。
内容的提问来源于stack exchange,提问作者CLOVIS
相关产品推荐
相关产品推荐

