2017-12-23 32 views
2

別のクラスのクラスの内部関数拡張(ModelAndViewStringでは、内部ではありません)を作成したいが、クラスの継承なしでこれを行う方法が見つかりませんでした。まったく可能ですか?クラス拡張の別のクラスのクラス用の関数の拡張

例:

class MyModelAndView : ModelAndView() { 
    infix fun String.to(value: Any?) { 
     addObject(this, value) 
    } 
} 
+0

「クラス拡張なし」とはどういう意味ですか? –

+0

sory、私は継承を意味する –

+0

それはまだ明らかではありません。何がうまくいかないかの例を見せてもらえますか? –

答えて

3

あなたは、クラスのメンバの拡張機能を作成することができますが、これらの拡張は、唯一のクラスにアクセスすることができます。

class X { 
    fun String.ext() = println("extension on $this called") 
    fun useExtension() { 
     val text: String = "myText" 
     text.ext() 
    } 
} 

にのみ、この拡張機能を使用することができますuseExtensionに示されているようなクラス内で、また例えばそのクラスの文脈では、with

with(x) { "abc".ext() } 

これはお勧めしませんが、DSLなどを書くときには意味があります。

+1

'with(x){" abc ".ext()}'を実行すると、クラスの外にアクセスできます。 – marstran

+0

クラスの文脈でのみ、これは受信者 'X 'を持つラムダであるために動作します – s1m0nw1

+1

「クラスのコンテキストでのみ」とはどういう意味ですか?クラスが公開拡張メソッドを定義している場合は、その 'with'トリックを使用して、そのクラスのオブジェクトを持つ任意の場所にアクセスできます。 – marstran

関連する問題