مشخصات مقاله
-
679
-
0.0
-
2174
-
0
-
0
آموزش نمایندگی(Delegation) در Kotlin
نمایندگی(Delegation) در Kotlin
Kotlin با معرفی واژهی کلیدی جدید by از الگوی طراحی delegation یا نمایندگی پشتیبانی میکند. 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
}
در این مثال رابط Base را به همراه متد انتزاعی آن به نام printme() را میبینید. در کلاس BaseImpl این متد پیادهسازی میشود و پس از آن پیادهسازی را از کلاس دیگری با استفاده از واژهی کلیدی by انجام میدهیم.
نتیجهی کد بالا بهصورت زیر نمایش داده میشود.
10
نمایندگی ویژگی(Delegate Properties)
در بخش بالا الگوی طراحی نمایندگی را با استفاده از واژهی کلیدی by آموختیم. در این قسمت میخواهیم با استفاده از برخی از متدهای استاندارد بیانشده در کتابخانهی Kotlin دربارهی نمایندگی ویژگیها صحبت کنیم.
Delegation در لغت به معنی دادن مسئولیت به کلاس یا متد دیگری است. زمانی که یک ویژگی از قبل در مکانی اعلان شده باشد، در این صورت ما برای مقداردهی اولیه به آن باید از همان کد استفاده کنیم. در مثالهای زیر از برخی از روشهای نمایندگی استاندارد که در Kotlin موجود هستند و برخی از توابع کتابخانهای استاندارد استفاده شده است در عین حال در مثالهای خود نمایندگی را نیز پیادهسازی میکنیم.
استفاده از Lazy()
Lazy() تابع لامبدایی است که بهعنوان ورودی، یک ویژگی را قبول میکند و در مقابل نمونهای از Lazy< T > را برگشت میدهد که < T > اساساً نوع ویژگیهای مورد استفادهی آن است. حالا برای درک چگونگی انجام این کار به مثال زیر توجه کنید.
val myVar: String by lazy {
"Hello"
}
fun main(args: Array< String >) {
println(myVar +" My dear friend")
}
در کد بالا متغیر myVar به تابع Lazy داده شده است که در ازای آن مقدار را به شیء آن تخصیص میدهد و همین نتیجه را به تابع main برگشت میدهد. در ادامه خروجی این کد مشخص است.
Hello My dear friend
Delegetion.Observable()
bservable() جهت دادن مقدار اولیه به شیء دو آرگومان را میپذیرد و همین ورودیها را به تابع فراخوانی شده برمیگرداند. در مثال زیر چگونگی استفاده از متد Observable() جهت پیادهسازی نمایندگی نشان داده شده است.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Welcome to Tutorialspoint.com") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array< String >) {
val user = User()
user.name = "first"
user.name = "second"
}
نتیجهی کد بالا را در پایین مشاهده میکنید.
first -> second
در کل سینتکس به این صورت است که به عبارت پس از واژهی کلیدی by نمایندگی داده شده است. متدهای get() و set() متغیر p به متدهای getValue() و setValue() تعریف شده در کلاس Delegate محول میشوند.
class Example {
var p: String by Delegate()
}
در رابطه با کد بالا در ادامه کلاس 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() فراخوانی میشود.