سورس اندروید اپلیکیشن کتاب آموزش پایتون 3
سورس اندروید اپلیکیشن کتاب آموزش پایتون 3
1398-08-12
آموزش کلمه کلیدی lateinit در کاتلین
آموزش lateinit در کاتلین
1398-08-13

Delegation در کاتلین چیست ؟ ما در کاتلین یک مفهوم بنام Delegation داریم که با دانستن همین مفاهیم است که میتوانیم با قاطعیت بگوییم از جاوا به کاتلین مهاجرت کردیم.چرا که تنها استناد به دانستن سینتکس کاتلین جهت کد نویسی کافی نیست بلکه باید از تمام یا حداقل اکثریت ویژگی هایی که کاتلین را نسبت به جاوا برتری داده استفاده کنیم و درباره آنها بدانیم.

مفهوم Delegation در کاتلین چیست

در علوم کامپیوتر Delegation به معنای واگذاری یک وظیفه یا اختیار از یک نمونه یا instance به نمونه دیگر است.درواقع Delegation میتواند به اندازه یک رابط استاتیک دائمی مانند ارث بری یا اینترفیس بین کلاس ها عمل کند.

اما این جمله به چه معناست ؟

فرض کنید ما میخواهیم از طریق کلاس B به عملکرد کلاس A دسترسی داشته باشیم بنابراین شما میتوانید ارث بری انجام دهید که به شما یک رابطه استاتیک دائمی بین کلاس ها میدهد.اما با Delegation شما میتوانید به هر تعداد کلاس با استفاده از کلمه کلیدی by دسترسی داشته باشید.

خب احتمالا کمی دچار سردرگمی شده اید اما در ادامه با پیاده سازی چندین مثال تمامی ابهامی های شما رفع خواهد شد .

توضیح مفهوم Delegation در Kotlin در قالب یک مثال

به مثال زیر توجه کنید:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val person = Person(aliName())
    Log.d("delegationTest" , person.name)
    Log.d("delegationTest" , person.family)
 }
}

interface Nameable {
     var name: String
     var family: String
 }

class aliName : Nameable {
     override var name: String = "ali"
override var family ="rahimi"
}

class Person(name: Nameable): Nameable by name

مفهوم Delegation در کاتلین در کلاس Person مشخص شده ! همانطور که میبینید ما یک interface اینترفیس ایجاد کردیم که دو متغیر از نوع String دارد.

 interface Nameable {
     var name: String
     var family: String
 }

در ادامه یک کلاس با نام aliName ایجاد کردیم که اینترفیس Nameable را implement یا پیاده سازی کرده پس مشخصا دو متغیر تغریف شد در اینترفیس را هم پیاده و مقداردهی کرده (تمامی بدنه اینترفیس باید در کلاس پیاده کننده مقداردهی شوند)

 class aliName : Nameable {
     override var name: String = "ali"
override var family ="rahimi"
}

در نهایت یک کلاس person ایجاد کردیم که برای واسطی برای دسترسی به کلاس های دیگر(در این مثال کلاس aliName) است.برای پارامترهای کلاس person ما یک پارامتر از نوع اینترفیس Nameable ایجاد کردیم تا در ادامه بتوانیم کلاسی که این اینترفیس را پیاده کرده به آن پاس دهیم و نکته مهم در انتهای کلاس عبارت Nameable by name : است که با این عبارت ما Delegation را مشخص کردیم ( هر پارامتری که پیاده میکنید باید در انتها Delegation هم شده اشد )

حال به متد اصلی کلاس اکتیویتی میرویم تا دستورات مورد نیاز برای نمایش خروجی این پروسه Delegation را بنویسیم

val person = Person(aliName())
         Log.d("delegationTest" , person.name)
         Log.d("delegationTest" , person.family)

همانطور که می بینید ما یک نمونه instance از کلاس Person با پارامتری که نیاز دارد (کلاسی که اینترفیس پارامتر شده کلاس Person را پیاده سازی میکند ) ایجاد کردیم و میتوانیم به فیلدهای اینترفیس دسترسی کامل داشته باشیم ، اگر ما برنامه را اجرا کنیم خروجی بدین صورت خواهد بود :

delegationTest : ali
delegationTest : rahimi

چرا که مقادیر person.name و person.family در واقع همان مقادیری ست که ما در کلاس aliName برای این دو فیلد مشخص کردیم ، حال اگر کلاس دیگری بدین صورت بسازیم :

 class kaveName : Nameable {
     override var name: String = "kave"
override var family ="maki"
}

و در دستورات اصلی کلاس فوق را به عنوان پارامتر به کلاس Person پاس دهیم

  val person = Person(kaveName())
         Log.d("delegationTest" , person.name)
         Log.d("delegationTest" , person.family)

خواهیم دید خروجی در لاگ کت بدین صورت خواهد شد:

delegationTest : kave
delegationTest : maki

به علاوه میتوانیم به هر تعداد کلاس به همین صورت دسترسی مستقیم داشته باشیم.برای مثال:

 interface job {
     var jobTime: Int
     fun doJob();
 }
class kaveJob : Job{
     override fun doJob() {
         Log.d("delegationTest" , "kave doing job ! ")
     }
override var jobTime: Int  = 8
}

و در نهایت در کلاس Person هم پارامتر دیگری از نوع اینترفیس job بگیریم

 class Person(name: Nameable, job: Job):  Nameable by name, Job by job

و در نهایت خواهیم دید که میتوانیم به تمامی بدنه اینترفیس Job هم دسترسی داشته باشیم

val person = Person(JackName(), kaveJob())
         Log.d("delegationTest" , person.name)
         Log.d("delegationTest" , person.family)
         person.doJob()

در نهایت خروجی بدین صورت خواهد شد:

delegationTest : kave
delegationTest : maki
! delegationTest: kave doing job

امیدوارم با مطالعه این پست به جواب سوال مفهوم Delegation در کاتلین چیست ؟ رسیده باشید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *