gpt4 book ai didi

java - 密封内部类

转载 作者:行者123 更新时间:2023-12-02 03:13:32 26 4
gpt4 key购买 nike

我想创建一个封闭的类宇宙,其中每个子类都是某个外部类的内部类。我想我可以使用密封内部类作为层次结构的基础,如下所示:

class Outer {
fun foo(): Int {
// ...
}

inner sealed class InnerBase(val i: Int) {
fun sharedFunctionality() {
println(foo() + i)
}

abstract fun doIt()

inner class Inner1: InnerBase(1) {
override fun doIt() {
blah()
sharedFunctionality()
bloo()
}
}
}
}

请注意

  • Outer 是一个适当的类,它可以有许多不同的实例。每个实例都应该能够创建 Inner1 来调用正确的 foo
  • InnerBase 子类的范围是有限的
  • InnerBase 有一些实例方法,供各种 Inner 子类使用,它访问 Outer 的非静态方法 foo
  • InnerBase 的具体子类(例如 Inner1)将参数传递给 InnerBase 的构造函数

但是,这样做的问题是我不知道如何在 Outer 中构造 Inner1 类型的值。我希望这会起作用:

class Outer { // continued from above
fun someMethod() {
val x: InnerBase = InnerBase.Inner1()
}
}

但是失败了

src/InnerSealed.kt:14:27: error: unresolved reference: Inner1
val x : InnerBase = InnerBase.Inner1()
^

我猜问题是 Inner1 实际上是 Inner 的内部类,所以在我之前需要一个 Inner 的实例可以构造一个 Inner1 的实例。然而,这不是我想要的;我希望 Inner 只是我的 Inner1 等类的基类,具有一些在所有子类之间共享并访问 Outer 的功能code> 的实例数据。

我发现的一个解决方法是使 InnerBase 成为非密封:

class Outer {
fun foo(): Int {
// ...
}

inner abstract class InnerBase(val i: Int) {
fun sharedFunctionality() {
println(foo() + i)
}

abstract fun doIt()
}

inner class Inner1: InnerBase(1) {
override fun doIt() {
sharedFunctionality()
}
}

fun someMethod() {
val x : InnerBase = Inner1()
}
}

但是 InnerBase 的子类不再封闭。

最佳答案

如果我理解正确的话,您不需要 Outer 实例,而是需要存储“staticfoo 的地方。那么你需要 object ,而不是 class

我用 object Outer 替换了 class Outer 并删除了 sealed:

object Outer {
var foo = 42

sealed class Inner(val i: Int) {
init {
println(foo + i)
}

class Inner1: Inner(1)
}

init {
val x: Inner = Inner.Inner1()
}
}

关于java - 密封内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40690937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com