با سلام خدمت کاربران گرامی سایت پی وی لرن و کاربرانی که علاقمند به دوره آموزش کاتلین هستند. در جلسه قبل با جنریک ها آشنا شدیم. در این جلسه به آموزش کار با Delegation در کاتلین می پردازیم.
در ادامه آموزش کار با Delegation در کاتلین در ابتدا باید اشاره کرد که امکان طراحی الگوی “delegation” به کمک کلمه کلیدی “by” در این زبان فراهم شده است.
استفاده از این کلمه کلیدی یا روش Delegation نتیجه خوبی به همراه دارد.
استفاده از آن به derived کلاس های کاتلین اجازه دسترسی به همه روش های عمومی پیاده سازی یک interface از طریق یک object را می دهد.
در مثال زیر می توانید وقوع این فرایند را ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 | 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 } |
در مثال بالا یک interface پایه “Base” با روش انتزاعی با نام ایجاد “()printme” شده است.
در کلاس BaseImpl این “()printme” اجرا می شود و سپس از یک کلاس دیگر روش اجرایی ای با استفاده از کلمه کلیدی “by” مورد استفاده قرار می گیرد.
قطعه کد بالا خروجی زیر را در مرورگر تولید می کند.
1 | 10 |
در قسمت قبلی طراحی الگوی Delegation را با استفاده از “by” یاد گرفتیم.
در این قسمت با کمک کتابخانه کاتلین با ویژگی های Delegation آشنا می شویم.
Delegation به معنای انتقال مسئولیت به یک کلاس یا متود دیگر است.
وقتی ویژگی ای در جایی بیان می شود، باید از یک کد مشابه برای مقدار دهی مجدد استفاده کرد.
در مثال زیر از بعضی از استاندارد های Delegation که در کتابخانه توابع کاتلین فراهم آمده، استفاده شده است.
Lazy یک تابع بدون مبدا است.
بیاید نگاهی به کد زیر بیا اندازیم تا با نحوه کار ان آشنا شویم.
1 2 3 4 5 6 | val myVar: String by lazy { "Hello" } fun main(args: Array<String>) { println(myVar +" My dear friend") } |
در کد بالا، ما یک متغیر “myVar” را به تابع Lazy می دهیم، که در عوض ارزش آن را به object اختصاص می دهد.
این کار موجب بازگشت تابع اصلی می شود.
قطعه کد بالا خروجی زیر را در مرورگر تولید می کند.
1 | Hello My dear friend |
()Observable از دو argument برای مقدار دهی object استفاده می کند و آن را به تابع called function برمی گرداند.
در مثال زیر نحوه استفاده از ()Observable برای اجرای Delegation را می بینید.
1 2 3 4 5 6 7 8 9 10 11 12 | 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" } |
قطعه کد بالا خروجی زیر را در مرورگر تولید می کند.
1 | first -> second |
به طور کلی سینتکسی که بعد از عبارت بعد “by” آمده است delegated است.
روش های ()get و ()set متغیر p به روش های ()getValue و ()setValue تعریف شده به کلاس Delegate منتقل می شود.
1 2 3 | class Example { var p: String by Delegate() } |
برای قطعه کد بالا، زیر کلاس delegate باید برای ایجاد مقدار در متغیر p ایجاد شود.
1 2 3 4 5 6 7 8 | 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 فراخوانی می گردد.
این جلسه به آموزش کار با Delegation در کاتلین اختصاص داشت و برخی از ویژگی های Delegation معرفی گردید.
در جلسه بعدی به آموزش کار با توابع در کاتلین خواهیم پرداخت.
با پی وی لرن همراه باشید.
حسین
آموزش بسیار گنگ و ناقص بود. فاجعه واقعی. خب حوصله توضیح دادن ندارید، چرا تولید آموزش می کنید؟؟؟ صرفا از یک سایت انگلیسی ۴ خط ترجمه کردید. انگار برای کسی که این آموزش رو مسلط هست، آموزش دادید!! تقریبا هیچی دستگیرم نشد، باید به منایع دیگر رجوع کنم.