在Kotlin中如何将对象成员暴露到另一个类的作用域中?
实现对象成员跨类作用域暴露的方案
Kotlin本身没有你示例里那种using a的直接语法,但有几种实用办法能实现你要的效果——让外部通过B的实例直接访问A的成员:
1. 显式转发成员
如果A的公共成员不多,直接在B里手动转发是最直接的方式:
class A { val foo = "test value" fun bar() = println("bar method executed") } class B(val a: A) { // 转发属性 val foo get() = a.foo // 转发方法 fun bar() = a.bar() }
这样外部就能像你期望的那样,用b.foo和b.bar()访问A的成员,缺点是成员数量多的时候会有大量重复代码。
2. 接口委托(推荐)
把A的公共成员抽象成接口,让A实现该接口,再让B通过by关键字将接口委托给A的实例,这样B会自动拥有接口内的所有成员,无需手动转发:
// 定义包含A所有需暴露成员的接口 interface AContract { val foo: String fun bar() } class A : AContract { override val foo = "test value" override fun bar() = println("bar method executed") } class B(a: AContract) : AContract by a { // 这里可以添加B自身的成员,同时自动拥有AContract的所有成员 fun bOwnMethod() = println("this is B's own method") }
这种方式适合成员较多的场景,还符合面向接口的设计原则,在Android UI开发中,把UI状态和行为抽象成接口,还能方便后续的测试或实现替换,刚好匹配你简化UI树依赖传递的需求。
补充说明
如果A是无法修改的第三方类,可以用适配器模式:写一个实现接口的适配器类包装A,再让B委托这个适配器即可。
内容的提问来源于stack exchange,提问作者Corey Cleasby
相关产品推荐
相关产品推荐

