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

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

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

class A {
   val foo
   fun bar() {
      
   }
}

class B(
   val a : A
) {
   using a // I want something like this statement
   
   ... etc
}

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

val a = A()
val b = B(a = a)

val c = b.foo
b.bar()


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

q1qsirdb

q1qsirdb1#

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

open class A {
   val foo: Int = 42
   fun bar() {
       
   }
}

class B(val a : A): A by a {}

fun main() {
    val a = A()
    val b = B(a = a)

    println(b.foo)
    b.bar()
}

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

interface A {
   val foo: Int
   fun bar() {
       
   }
}

// Create an intermediate class that implements A
class AA : A {
    override val foo: Int = 42
    
    override fun bar() {}
}

class B(val a : A): A by a {}

fun main() {
    val a = AA()      // Instantiates `AA` instead of `A`
    val b = B(a = a)

    println(b.foo)    // Outputs 42
    b.bar()
}

相关问题