You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:43:12