我想创建一个封闭的宇宙类,其中每个子类是一些外部类的内部类。我以为我可以使用密封的内部类层次结构的基础上,像这样:密封的内部类
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
的实例数据。
一个解决办法,我发现是使InnerBase
非sealed
:
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
子类都不再是封闭的。
是的,但是'Inner'不能是静态的,因为它需要访问'Outer'的'foo'字段。 – Cactus