我有以下设置:


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()时创建的闭包对象内部,您可以访问范围中的所有变量(包括用于调用AB()实例)。

如果您希望对象B具有A的所有成员,则可能应该看看继承而不是内部类。或者像您一样将访问器公开给A实例。

09-26 08:20