Kotlin-delegation

提供:Dev Guides
移動先:案内検索

コトリン-委任

Kotlinは、新しいキーワード*“ by” を導入することにより、“委任” *デザインパターンをサポートしています。 このキーワードまたは委任方法論を使用して、Kotlinは派生クラスが特定のオブジェクトを介してインターフェースの実装されたすべてのパブリックメソッドにアクセスできるようにします。 次の例は、これがKotlinでどのように発生するかを示しています。

interface Base {
   fun printMe()//abstract method
}
class BaseImpl(val x: Int) : Base {
   override fun printMe() { println(x) }  //implementation of the method
}
class Derived(b: Base) : Base by b //delegating the public method on the object b

fun main(args: Array<String>) {
   val b = BaseImpl(10)
   Derived(b).printMe()//prints 10 :: accessing the printMe() method
}

この例では、「printme()」という名前の抽象メソッドを持つ1つのインターフェイス「Base」があります。 BaseImplクラスでは、この「printme()」を実装し、後で別のクラスから「by」キーワードを使用してこの実装を使用しています。

上記のコードは、ブラウザに次の出力を生成します。

10

プロパティの委任

前のセクションでは、「by」キーワードを使用した委任設計パターンについて学習しました。 このセクションでは、Kotlinライブラリで言及されているいくつかの標準的な方法を使用したプロパティの委任について学習します。

委任とは、責任を別のクラスまたはメソッドに渡すことです。 プロパティが既にいくつかの場所で宣言されている場合、同じコードを再利用してそれらを初期化する必要があります。 次の例では、例で委任を実装するときに、Kotlinが提供する標準的な委任方法論と標準ライブラリ関数を使用します。

Lazy()を使用する

Lazyは、プロパティを入力として受け取り、代わりに Lazy <T> のインスタンスを提供するラムダ関数です。ここで、<T>は基本的に使用するプロパティのタイプです。 以下を見て、どのように機能するかを理解しましょう。

val myVar: String by lazy {
   "Hello"
}
fun main(args: Array<String>) {
   println(myVar +" My dear friend")
}

上記のコードでは、変数「myVar」をLazy関数に渡します。これにより、値がオブジェクトに割り当てられ、メイン関数に同じ値が返されます。 以下はブラウザの出力です。

Hello My dear friend

Delegetion.Observable()

Observable()はオブジェクトを初期化するために2つの引数を取り、呼び出された関数に同じものを返します。 次の例では、委任を実装するためにObservable()メソッドを使用する方法を示します。

import kotlin.properties.Delegates
class User {
   var name: String by Delegates.observable("Welcome to finddevguides.com") {
      prop, old, new ->
      println("$old -> $new")
   }
}
fun main(args: Array<String>) {
   val user = User()
   user.name = "first"
   user.name = "second"
}

上記のコードは、ブラウザに次の出力を生成します。

first -> second

一般に、構文は「by」キーワードが委任された後の式です。 変数 p の* get()および set()メソッドは、Delegateクラスで定義された getValue()および setValue()*メソッドに委任されます。

class Example {
   var p: String by Delegate()
}

上記のコードの場合、変数 p に値を割り当てるために生成する必要があるデリゲートクラスは次のとおりです。

class Delegate {
   operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
      return "$thisRef, thank you for delegating '${property.name}' to me!"
   }
   operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
      println("$value has been assigned to '${property.name} in $thisRef.'")
   }
}

読み取り中にgetValue()メソッドが呼び出され、変数の設定中にsetValue()メソッドが呼び出されます。