我目前正在研究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()
答案 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。