私はクラスの閉じたユニバースを作成したいと思います。各サブクラスはいくつかの外部クラスの内部クラスです。封印された内部クラス
Outer
は、多くの異なるインスタンスを持つことができる適切なクラスであることを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() } } } }
注:私は、私はそうのように、階層のベース用密封された内部クラスを使用すると考えていました。各インスタンスは、非S「の右
foo
- を呼び出す
InnerBase
サブクラスの宇宙が有限である InnerBase
はOuter
にアクセスする様々なInner
サブクラスで使用されるいくつかのインスタンスメソッドを有することS」Inner1
を作成することができなければなりません静的メソッドInnerBase
の具象サブクラスfoo
(例えばInner1
)、
しかしInnerBase
のコンストラクタに引数を渡しますこの問題は、タイプInner1
の値をどのようにしてOuter
に構築できるかわかりません。私はこれがうまくいくことを期待していた:
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'は、静的にすることはできません。 – Cactus