اکستنشن ها (Extensions) برای دسترسی به ویژگی های بیشتر یک شی (object) بسیار کاربردی هستن. در واقع به کمک اون ها میتونید ویژگیهای بیشتری برای اشیا در کاتلین داشته باشید.
در بعضی مواقع حتی اون ها رو میتونید جایگزین کلاس های ثابت (Object or Static class) کنید.
فرض کنید میخواهید در داخل فرگمنتها یک پیغام از نوع Toast نمایش دهید. در حالت عادی کدی مشابه زیر در هر فرگمنت خواهید داشت.
fun showToast(message:String){ activity?.let { // 1 Toast.makeText(it,message,Toast.LENGTH_SHORT).show() } }
1 - در فرگمنت ها باید حتما وضعیت نال (null) بودن activity رو چک کنید و سعی کنید از ()requireActivity استفاده نکنید چرا که در صورت نال بودن اکتیویتی، exception دریافت میکنید.
حالا بیاید با کمک اکستنشن، یک ویژگی جدید به فرگمنتها اضافه کنیم که دیگه نیازی نباشه تو هر فرگمنت متد showToast رو بنویسیم.
fun Fragment.showToast(message: String) { this.activity?.let { // 1 Toast.makeText(it, message, Toast.LENGTH_SHORT).show() } }
همونطور که میبینید قبل از اسم متد (showToast) ما باید شیای که میخواهیم به آن ویژگی اضافه کنیم رو مشخص کنیم. در واقع با کمک کد بالا، ما یک ویژگی جدید بهنام showToast به فرگمنت اضافه کردیم که این ویژگی در تمام فرگمنت ها دردسترس خواهد بود و دیگه نیازی نیست تو همه فرگمنتها کد اولی رو داشته باشیم. در مورد نکته یک هم باید بگم که کلمه کلیدی this داره به Fragment اشاره میکنه.( this = کلاسی که داریم بهش ویژگی اضافه میکنیم)
حالا بیاید یه مثال دیگه رو ببینیم تا مفهوم واضح تر بشه.
اگه یادتون باشه بالاتر گفتم که میتونیم اکستنشنها رو جایگزین بعضی از کلاسهای ثابت کنیم. مثلا فرض کنید یه کلاس ثابت دارید که براتون چک میکنه به اینترنت وصل هستید یا نه (connection check).
object ConnectionCheck { fun isConnected(context: Context): Boolean { return (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo?.isConnected == true } }
همونطور که میبینید من یه کلاس ثابت دارم که از همه جا تو پروژه در دسترس هستش و وضعیت اتصال رو بهم میگه. حالا بیاید با اکستنشن از دستش خلاص بشیم.
val Context.isConnected: Boolean get() { return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager) .activeNetworkInfo?.isConnected == true }
و تمام ! حالا فقط کافیه از هر کلاسی که به Context دسترسی داره، ویژگی isConnected رو ازش صدا کنم. مثلا الان میخوام از داخل یه فرگمنت وضعیت اتصال رو چک کنم :
context?.isConnected
باید بگم فوقالعاده است !
اینجا من فقط سعی کردم دو تا مثال ساده رو بیان کنم. اما این مطلب پایانی نداره و تا دلتون بخواد میتونید اکستنشن به کلاسهاتون اضافه کنید. اینم بگم که شما به همه نوع کلاسی میتونید اکستنشن اضافه کنید . حتی به کلاسهایی که خودتون نوشتید و نه فقط به کلاسهای خود اندروید.