37664


Kotlinで下記のように、メンバ変数を委譲先にするとUnresolved reference: helloImplとなります。

[code]

    interface IHello {
        fun hello()
    }
    
    class HelloImpl: IHello {
        override fun hello() {
            println("Hello")
        }
    }
    
    class Hello: IHello by helloImpl {
        val helloImple = HelloImpl()
    }
    
[/code]

byの後ろで直接インスタンスを生成した場合や

[code]

    class Hello: IHello by HelloImpl() {
    }
    
[/code]

コンストラクタの引数を使用した場合はエラーになりません。

[code]

    class Hello(val helloImpl: HelloImpl) : IHello by helloImpl {
    }
    
[/code]

しかし、直接インスタンスを渡すと、委譲先のオブジェクトにアクセスできませんし、クラス内部で生成できるのでコンストラクタの引数にしたくもありません。  
メンバ変数を委譲先にする方法はないのでしょうか？

あるいは、`IHello by HelloImpl()`で生成したオブジェクトにアクセスする手段はないでしょうか？`this.HelloImpl`等で。


CC BY-SA 3.0
2017-09-01T10:23:17.860
37663
2017-09-02T10:24:05.143
2017-09-02T10:24:05.143
17238
17238
question
kotlin
KotlinのClass Delegationでメンバ変数を委譲先にできないのはなぜ？


メンバ変数を委譲先にする方法については[Class delegate using internal property - Language Design -
Kotlin Discussions](https://discuss.kotlinlang.org/t/class-delegate-using-
internal-property/1867)に同様の質問がありました。答えは「今のところは不可能」だそうです。

リンク先にもあるように、コンストラクタの引数になっていることを隠す目的なら`private constructor`を使うことができます。

[code]

    class Hello private constructor(val h: IHello) : IHello by h {
        constructor() : this(HelloImpl())
    }
    
[/code]

**9月2日追記**  
`by`に続けて書く形で生成したオブジェクトへのアクセスついても[Access internally stored object used for
class delegation - Kotlin
Discussions](https://discuss.kotlinlang.org/t/access-internally-stored-object-
used-for-class-delegation/2478)に同様の質問があり、やはり不可能だそうです。


CC BY-SA 3.0
2017-09-01T11:34:18.407
37664
2017-09-02T08:11:41.820
2017-09-02T08:11:41.820
13199
13199
37663
answer