توابع توسعه یافته

فرض کنید شما نیاز دارید تا یک قابلیت جدید را به یک کلاس اضافه کنید. برای این منظور، در بیشتر زبان‌های برنامه نویسی راه‌های مختلفی برای انجام این کار وجود دارد. برای مثال، یک کلاس جدید درست کنید و آن را فرزند کلاس مورد نظر خود قرار دهید، سپس ویژگی‌های جدید را به کلاس جدید اضافه کنید، روش دیگر استفاده از الگوی های طراحی مناسب است.
در کاتلین همچنین شما می‌توانید از توابع توسعه یافته یا extension function برای افزودن قابلیت‌های جدید به یک کلاس استفاده کنید. یک تابع توسعه یافته، خود یکی از توابع کلاسی محسوب می‌شود، با این تفاوت که در خارج از کلاس آن را تعریف می‌کنیم. برای مثال فرض کنید شما می‌خواهید یک متد به کلاس String اضافه کنید که یک رشته جدید که کاراکتر اول و آخر آن حذف شده را برگرداند. این متد از قبل در کلاس String وجود ندارد، اما شما می‌توانید با استفاده از توابع توسعه یافته آن را به کلاس String اضافه کنید:

fun String.removeFirstLastChar(): String = this.substring(1, this.length - 1)

fun main(args: Array<String>)
{
    val myString= "Hello World"
    val result = myString.removeFirstLastChar()
    println(result)
}
ello Worl

در این مثال، تابع توسعه یافته ()removeFirstLastChar را به کلاس String اضافه کردیم. برای درک بهترِ چگونگی ایجاد یک تابع توسعه یافته به تصویر زیر توجه کنید:

در این ساختار، به جای receiver type نام کلاسی که می‌خواهیم یک قابلیت جدید را به آن اضافه کنیم می‌نویسم که در مثال ما کلاس String است. به طور کلی زمانی که از receiver type یک نمونه جدید ایجاد می‌کنیم، با استفاده از کلمه کلیدی this می‌توانیم به function ها و property های کلاس، داخل خودش دسترسی داشته باشیم. بنابراین کلمه کلیدی this در اینجا به receiver object یا همان شیء ساخته شده از کلاس ما اشاره می‌کند. اگر شما نیاز دارید تا پروژه جاوای خود را با کاتلین یکپارچه کنید، لازم نیست کل پروژه را به کاتلین تغییر دهید، فقط کافی است از توابع توسعه یافته برای افزودن قابلیت‌ها استفاده کنید.