是否可以在Kotlin中创建“扩展类”?

时间:2020-08-07 08:30:03

标签: kotlin

我目前正在研究Kotlin项目,该项目处理大量硬件,并且我一直在寻找一种方法来创建类似于扩展功能的东西,除了类之外。在这种情况下,我希望一个类充当另一个子类的子类,但仍要与另一个包分开。通常,我会像这样使用类:

class TestTrackingTableView: TestTableView<TrackOrderV3, TrackingTableViewModel>, UITableView
class Foo() {
    fun doSomething() {
        ...
    }
}
class Bar(val foo: Foo) {
    fun doSomethingWithFoo() {
        foo.doSomething()
    }
}

是否可以通过执行扩展功能来使此代码更具可读性?

val myFoo = Foo()
val myBar = Bar(myFoo)
myBar.doSomethingWithFoo()

我现在打算使用包装器扩展功能,但是我想知道是否可以直接实现。

// Is this possible?
val myFoo = Foo()
val myBar = myFoo.Bar()
myBar.doSomethingWithFoo()

1 个答案:

答案 0 :(得分:3)

您所描述的似乎是delegate:一个类,它将所有方法(除非被覆盖)转发到另一个类的实例。

Kotlin具有对此的内置支持(不同于Java),但是要使其正常工作,两个类都需要实现一个接口:

interface MyInterface {
    fun doSomething()
}

class Foo() : MyInterface {
    override fun doSomething() {
        // ...
    }
}

class Bar(val foo: MyInterface) : MyInterface by foo

这与问题中的代码几乎相同,但没有手动指定doSomething()转发的样板。

其中一个狡猾的地方是看起来很天真的by foo:它指定Bar是一个委托,通过将所有MyInterface方法转发到foo来实现它们。 (当然,您可以根据需要添加和覆盖方法-代表完全与正转发到的对象一样,委托中没有什么意义!)

有关更多信息,请参见Kotlin documentation

相关问题