在类层次结构中以静态和非静态方式提供参数的Kotlin方法是什么?

问题描述 投票:0回答:1

我想在Kotlin中实现以下设计:

类层次结构的大小,共享一个公共根(我们称它为Base)。此层次结构的所有类都有一些参数,应该可以静态(因为在工厂方法中需要它们)和动态(因为从外部代码中需要它们)都可以访问这些参数。另外,由于我将创建这些类的很多实例,因此我想避免实例化每个实例的属性列表/集合。

这是我能够组合在一起的,虽然可以,但是感觉很丑。

abstract class Base {
    open val params: List<Int> get() = Companion.params

    companion object : BaseCompanion()
}
abstract class BaseCompanion {
    open val params: List<Int> = emptyList<Int>()
}

class A: Base() {
    override val params: List<Int> get() = Companion.params

    companion object : BaseCompanion() {
        override val params: List<Int> = listOf(1, 3)
    }
}

感觉很笨拙的部分是,每个从Base继承的类都必须:

  • 具有从BaseCompanion继承的同伴对象(这里实际上不需要,但是我需要一些东西来传递给通用工厂方法)。
  • 在其中包含自己的静态变量参数。
  • 重写params属性,使其从其自己的伴随对象返回值。

是否有更好,更实用的Kotlin方法?

inheritance kotlin static
1个回答
0
投票

反之亦然,例如,从外部传递列表,例如:

abstract class Base(val params : List<Int>)

class A(params : List<Int>) : Base(params)

在对象创建方面,只需保留该“静态”列表并将其传递给新创建的对象:

val staticParams = listOf(1, 3)
val oneOfManyA = A(staticParams)

[如果您仍然希望单独实例化A而无需传递静态参数和/或通过将其保留在同伴中的外观,您仍然可以通过使用invoke-运算符来做到这一点:

class A(params : List<Int>) : Base(params) {
  companion object {
    private val staticParams = listOf(1, 3)
    operator fun invoke() = A(staticParams)
  }
}

现在您可以按如下方式调用它,它将使用伴随对象中的静态参数实例化:

A()
© www.soinside.com 2019 - 2024. All rights reserved.