Extension function

تعتبر دالة عادية كما سبق وتعرفنا ولكن كيف تكون امتداد او extension ؟ او لنوضح السؤال أكثر ما فائدتها ؟

ماذا لو اردنا اضافة دالة غير موجودة مسبقاً في class string مثلاً ؟ حتماً ستحتاج الى extension وساوضحها هنا في مثالين :

حسنا نستطيع بناء دالة تكون امتداد لطبقة ما class  دون التعريف عنها ، مثال على ذلك :

طبقة {class} خاصة بالسيارة :

لنفرض اننا قمنا بانشاء class لـcar وكان يحتوي على func واحة فقط وهي لحساب السرعة اذا كانت منخفضة .

class Car{

    fun LowSpeed(sp:Int):Boolean{
        return sp <100
    }
}

دالة extension للطبقة car :

الان بعد فترة من الوقت احتجت ان اقوم باضافة دالة جديدة لclass car ولكن لا اريد التعديل عليه ؟ ساقوم باستخدام extension كما ستلاحظ في الشفرة التالية

fun Car.highSpeed(sp:Int):Boolean{
    return sp >100
}

نلاحظ أنها دالة عادية ولكن لتكون امتداد لطبقة ما نقوم بوضع اسم الطبقة ومن ثم اسم الدالة كما هو ملاحظ لدينا Car.highSpeed

في الدالة الرئيسية :

fun main(args:Array<String>){

    var car1= Car()
    println("please enter the speed:")
    var speed :Int = readLine()!!.toInt()
    println("speed is : "+car1.LowSpeed(speed))
    println("speed is : "+car1.highSpeed(speed))

}

لدينا أنواع المتغيرات التي هيا (Int – String – Char …إلخ ) وهي تعتبر classes  – طبقات بالأساس ولها دوالها الخاصة بها وخصائصها ومن هنا نستطيع القول أنه ينطبق عليها أيضا ما فعلنا سابقا حيث نستطيع انشاء دالة امتداد تكون لطبقة String مثلا أو Int او أي طبقة .

المثال الثاني :

اريد اضافة extension لـstring class ليقوم بتحويل المسافات الى camelCase لاحظ الشفرة القادمة

fun String.spaceToCamelCase() { ... }

كتبنا اسم الكلاس String وقمنا بانشاء الدالة الجديدة spaceToCamelCase والتي ستقوم بتحويل النص وطريقة استخدامها كالتالي

"Convert this to camelcase".spaceToCamelCase()