当前位置: 首页 > 知识库问答 >
问题:

在类层次结构中静态和非静态访问成员的Kotlin方法是什么?

范浩宕
2023-03-14

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

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)
    }
}
    null

有没有更好的,更Kotlin的方法?

共有1个答案

蒋正平
2023-03-14

不如换个方式来做,即从外部传递列表,例如:

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

根据您真正想要做的事情,扩展属性可能也符合目的(这不是一个建议,只是一种解决问题的方法;-)):

abstract class Base
class A : Base()


val A.params
      get() = listOf(1, 3)

// or:
val staticParams = listOf(1, 3)
val A.params
      get() = staticParams

这样,您就可以节省同伴对象等,并将您的静态列表直接附加到A。这有其自身的缺点,但也可能是一个解决方案。

 类似资料:
  • 在Java和Android中,我们可以这样做: 这样,在其他地方,我们就可以做到这一点: //编辑也许我应该说得更清楚些。我的意思是我们如何才能用Kotlin写上面的内容,用Kotlin。

  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?

  • 问题内容: 通常,在面向对象的范例中,静态方法只能访问静态变量和静态方法。如果是这样,那么就会出现一个明显的问题,即Java中的main()方法如何才能访问非静态成员(变量或方法),即使它特别是公共静态void … !!! 问题答案: main方法也无权访问非静态成员。

  • 本文向大家介绍在一个静态方法内调用一个非静态成员为什么是非法的?相关面试题,主要包含被问及在一个静态方法内调用一个非静态成员为什么是非法的?时的应答技巧和注意事项,需要的朋友参考一下 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

  • 问题内容: 我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象会自动具有对该外部类对象的隐藏引用。但是为什么非静态内部类不能具有静态成员呢?Java设计人员只需要禁止在内部类的静态方法内访问非静态外部类字段,这样做会更有意义,不是吗? 如果在内部类中具有静态成员没有意义,那么为什么内部类可以通过继承具有静态成员的类来继承静态成员? 我也读了这篇文章。如前所述: 内部类可以继