在Kotlin的不同类的作用域中公开对象的成员

qfe3c7zg  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(301)

是否可以将对象的公共成员变量和方法公开到类的作用域中?例如,

  1. class A {
  2. val foo
  3. fun bar() {
  4. }
  5. }
  6. class B(
  7. val a : A
  8. ) {
  9. using a // I want something like this statement
  10. ... etc
  11. }

字符串
在这个例子中,我希望能够像这样访问a的方法

  1. val a = A()
  2. val b = B(a = a)
  3. val c = b.foo
  4. b.bar()


这可能看起来很傻,但我正在构建一个Android应用程序,这样可以更容易地将依赖项传递到UI树中。

q1qsirdb

q1qsirdb1#

你可以使用一个名为delegation的Kotlin特性:

  1. open class A {
  2. val foo: Int = 42
  3. fun bar() {
  4. }
  5. }
  6. class B(val a : A): A by a {}
  7. fun main() {
  8. val a = A()
  9. val b = B(a = a)
  10. println(b.foo)
  11. b.bar()
  12. }

字符串
但是,请注意,这将在B的声明中出现“Only interfaces can be delegated to”错误。这意味着A必须是此功能工作的接口。解决方法:

  1. interface A {
  2. val foo: Int
  3. fun bar() {
  4. }
  5. }
  6. // Create an intermediate class that implements A
  7. class AA : A {
  8. override val foo: Int = 42
  9. override fun bar() {}
  10. }
  11. class B(val a : A): A by a {}
  12. fun main() {
  13. val a = AA() // Instantiates `AA` instead of `A`
  14. val b = B(a = a)
  15. println(b.foo) // Outputs 42
  16. b.bar()
  17. }

展开查看全部

相关问题