【问题标题】:Kotlin lambda parameter vs. abstract valueKotlin lambda 参数与抽象值
【发布时间】:2018-03-28 16:35:49
【问题描述】:

如何更好地将 lambda 函数传递给用作父类的类:将其作为参数传递或在父类中将其定义为抽象 lambda,然后在子类中覆盖它?

将其作为参数传递:

open class Weapon(val someFunction: () -> Unit) {
    ...
}

class TheWeapon() : Weapon({ ... }) {
    ...
}

或者定义它以在父类中将其定义为抽象 lambda,然后在子类中覆盖它:

abstract class Weapon() {
    abstract val someFunction: () -> Unit;
    ...
}

class TheWeapon() : Weapon() {
    override val someFunction: () -> Unit = { ... }
    ...
}

那么用什么方案比较好呢?

【问题讨论】:

  • 你能把()->Unit 传递给方法吗?

标签: lambda kotlin readability


【解决方案1】:

如果您打算使用第二种方法,为什么不使用您覆盖的这种类型的方法呢?似乎TheWeapon 可以提供 lambda 本身并且不将其作为参数,因此您可以将代码从 lambda 移动到抽象函数:

abstract class Weapon {
    abstract fun someFunction()
}

class TheWeapon : Weapon() {
    override fun someFunction() { ... }
}

如果TheWeapon 通过其构造函数从外部源接收 lambda,那么您必须另辟蹊径,让Weapon 也将 lambda 作为构造函数参数。

【讨论】:

  • 我将函数传递给另一个对象,所以如果函数是 lambda,结构更容易理解。此外,我在“TheWeapon”类中定义了该函数,因此无需将其作为参数传递。如果 lamda 在 'TheWeapon' 的主体中定义为 val,是不是更容易阅读代码?
  • 归根结底,这将取决于您。我认为抽象方法及其覆盖看起来很干净。如果您稍后需要传递对此函数的引用,您可以在TheWeapon 类中使用this::someFunction 的绑定方法引用来实现。
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多