Delegation در کاتلین چیست ؟ ما در کاتلین یک مفهوم بنام Delegation داریم که با دانستن همین مفاهیم است که میتوانیم با قاطعیت بگوییم از جاوا به کاتلین مهاجرت کردیم.چرا که تنها استناد به دانستن سینتکس کاتلین جهت کد نویسی کافی نیست بلکه باید از تمام یا حداقل اکثریت ویژگی هایی که کاتلین را نسبت به جاوا برتری داده استفاده کنیم و درباره آنها بدانیم.
در علوم کامپیوتر Delegation به معنای واگذاری یک وظیفه یا اختیار از یک نمونه یا instance به نمونه دیگر است.درواقع Delegation میتواند به اندازه یک رابط استاتیک دائمی مانند ارث بری یا اینترفیس بین کلاس ها عمل کند.
اما این جمله به چه معناست ؟
فرض کنید ما میخواهیم از طریق کلاس B به عملکرد کلاس A دسترسی داشته باشیم بنابراین شما میتوانید ارث بری انجام دهید که به شما یک رابطه استاتیک دائمی بین کلاس ها میدهد.اما با Delegation شما میتوانید به هر تعداد کلاس با استفاده از کلمه کلیدی by دسترسی داشته باشید.
خب احتمالا کمی دچار سردرگمی شده اید اما در ادامه با پیاده سازی چندین مثال تمامی ابهامی های شما رفع خواهد شد .
به مثال زیر توجه کنید:
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 یا پیاده سازی کرده پس مشخصا دو متغیر تغریف شد در اینترفیس را هم پیاده و مقداردهی کرده (تمامی بدنه اینترفیس باید در کلاس پیاده کننده مقداردهی شوند)
همچنین بخوانید: آموزش Expandable RecyclerView در اندروید با کاتلین
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 برای این دو فیلد مشخص کردیم ، حال اگر کلاس دیگری بدین صورت بسازیم :
همچنین بخوانید: معماری mvp در اندروید با کاتلین
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 در کاتلین چیست ؟ رسیده باشید.