【问题标题】:Is it possible to create an "extension class" in Kotlin?是否可以在 Kotlin 中创建“扩展类”?
【发布时间】:2020-08-07 08:30:03
【问题描述】:

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

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()

我现在将使用包装器扩展功能作为替代方案,但我想知道这是否可以直接实现。

// Wrapper function I'm using
fun Foo.Bar(): Bar {
    return Bar(this)
}

【问题讨论】:

标签: kotlin


【解决方案1】:

您所描述的似乎是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 是一个委托,通过将它们转发给foo 来实现所有MyInterface 方法。 (当然,您可以根据需要添加和覆盖方法 - 委托的行为完全就像它转发到的对象一样!)

有关详细信息,请参阅Kotlin documentation

【讨论】:

  • 感谢您的回答,我有空时会研究一下,但这可能实际上是我正在寻找的。​​span>
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2015-02-05
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多