如何从 class 外部访问对象内部的扩展 属性?
How to access extension property inside object from outside class?
示例:
class Foo {
fun foo() = Unit
}
object Bar {
val Foo.foo get() = Unit
}
fun Foo.bar() = Bar.foo
扩展符号在 class 实例中时不是静态的,所以我不明白为什么这不能通过简单地传入接收器来实现。
你可以这样做,但你必须将 Bar
也作为接收者带入上下文,同时引用 someFoo.foo
否则你会说 Bar
有一个属性 foo
它没有。它在其范围(及其实例)内具有 Foo.foo
的扩展名。因此,将您的最后一行更改为:
fun Foo.bar() = Bar.foo
至:
fun Foo.bar() = with (Bar) { foo }
概念上是这样的:
fun Foo.bar() = with (Bar) { this@bar.foo }
所以我们使用with
将Bar
接收器堆叠在this@bar
的Foo
实例接收器下并访问属性foo
.
示例:
class Foo {
fun foo() = Unit
}
object Bar {
val Foo.foo get() = Unit
}
fun Foo.bar() = Bar.foo
扩展符号在 class 实例中时不是静态的,所以我不明白为什么这不能通过简单地传入接收器来实现。
你可以这样做,但你必须将 Bar
也作为接收者带入上下文,同时引用 someFoo.foo
否则你会说 Bar
有一个属性 foo
它没有。它在其范围(及其实例)内具有 Foo.foo
的扩展名。因此,将您的最后一行更改为:
fun Foo.bar() = Bar.foo
至:
fun Foo.bar() = with (Bar) { foo }
概念上是这样的:
fun Foo.bar() = with (Bar) { this@bar.foo }
所以我们使用with
将Bar
接收器堆叠在this@bar
的Foo
实例接收器下并访问属性foo
.