【发布时间】:2016-11-19 08:49:39
【问题描述】:
我想创建一个封闭的类世界,其中每个子类都是某个外部类的内部类。我以为我可以使用密封的内部类作为层次结构的基础,如下所示:
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 的子类不再关闭。
【问题讨论】:
标签: java inheritance scope kotlin inner-classes