我有以下设置:
class A {
fun runA() {
}
inner class B {
fun runB() { // Proxy method for runA()
runA() // its okay to call it here
}
}
}
fun test() {
val obj = A().B()
obj.runA() // how to call this one??
obj.runB() // i do not want to add a proxy method for everything in A
}
当我只有B对象时,有什么方法可以调用
runA()
吗?B的每个实例始终与A的实例耦合,因此从理论上讲应该是可能的(并且由于我能够从B内调用runA()证明)
我目前拥有的最佳解决方案是在B中提供A的访问器,如下所示:
inner class B {
fun a(): A = this@A
fun runB() {
runA()
}
}
然后像
obj.a().runA()
这样称呼它如果我可以直接调用
obj.runA()
,那就太好了,除了编译器不允许之外,我看不出为什么在技术上不应该这样做的原因。感谢您的输入!
最佳答案
B
不是A
。编译器为B
提供了对自己的A
的私有(private)引用,因为他需要它来执行runA
。但这是私有(private)的,并不意味着您可以从那里访问。您可以只编写runA
,它就可以在runB
中使用,因为内部类在范围内具有父类的所有成员,就像使用闭包时一样。参见此示例的类比:
class A {
fun runA() {
}
fun B {
{
runA() // its okay to call it here
}
}
}
fun test() {
val obj = A().B()
obj()
}
与内部类所见类似,在调用成员
B()
时创建的闭包对象内部,您可以访问范围中的所有变量(包括用于调用A
的B()
实例)。如果您希望对象
B
具有A
的所有成员,则可能应该看看继承而不是内部类。或者像您一样将访问器公开给A
实例。