2016-11-19 7 views
0

私はクラスの閉じたユニバースを作成したいと思います。各サブクラスはいくつかの外部クラスの内部クラスです。封印された内部クラス

  • 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サブクラスの宇宙が有限である
  • InnerBaseOuterにアクセスする様々な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のインスタンスデータにアクセスするいくつかの機能を備えています。私が見つけた

回避策の一つは作ることですInnerBasesealed

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のサブクラスはもはや閉じている

答えて

0

静的な場所が見つからないことがありますか?クラスをインスタンス化して内部を使用したくない場合。

私はコトルのように熟練していないので、私はひどく間違っているかもしれません。

+0

うんが、中にこれを行うのいずれかのきれいな方法を認識していないです 'Inner'は、静的にすることはできません。 – Cactus

1

あなたが正しく理解していれば、「staticfooを保存する場所としてOuterのインスタンスは必要ありません。それでobjectが必要です。classではなくです。

私はobject Outerclass 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() 
    } 
} 
+0

は、まあ、私の実際のプログラムでは、Outer' 'で起こって他のものがたくさんありますし、私は確かにそれの複数のインスタンスを持つことを計画ありません。 – Cactus

1

何をしようとする技術的にはこれです:

class Outer { 
    var foo = 42 
    init { 
     val x: InnerBase = InnerBase.Inner1(this) 
    } 

    sealed class InnerBase(val outer: Outer, val i: Int) { 

     fun sharedFunctionality() { 
      println(outer.foo + i) 
     } 

     abstract fun doIt() 

     class Inner1(outer: Outer): InnerBase(outer, 1) { 
      override fun doIt() { 
       sharedFunctionality() 
      } 
     } 
    } 
} 

それはInnerのインスタンスなしにOuterのインスタンスでInner1を提供。それは `Outer`の` foo`フィールドにアクセスする必要があるので、私はKotlin

+0

はい、まさに私は 'Inner1'に暗黙的に' outer'を渡したいと思います。そうする方法がないのですか?その場合、私はむしろオープンな継承の回避策をとると思います。 – Cactus

+0

「インナー」が列挙型か – voddan

関連する問題