interface

 أولاً:تمهيد :-

هل قد خطر في بالك أثناء تصميم مشروعك أنك تعلن عن دالة ولكن لا تعلم ما لذي ستضعه بداخلها أو أنك تريد الإعلان فقط وستستخدمها لاحقاً ؟ في بيئة Kotlin نستطيع فعل ذلك عن طريق إما abstract أو interface ، هذه العناصر تمكني من الإعلان عن متغيرات ودوال بدون أن أكتب قطع برمجية بمعنى أني فقط أعرف عن دالة ولكني ما تتضمنه هذه الدالة سأؤجل كتابته إلى حين أحتاجه .


 ثانياً:التعريف عن interface :-

كما قلنا سابقا نستطيع فيه الإعلان عن الدوال التي سأستخدمها لاحقاً .

interface myInterface{
    
    
}

 ثالثاً:الإعلان في interface :-

سنوضح الأن كيفية تجهيز المتغيرات والاعلان عنها وعن الدوال :-

interface myInterface{

    fun sum()
    fun sub()
    fun mul(num1:Int,num2:Int){
        var result = num1*num2
    }
    var num1:Int

}
  • اعلنا عن دالة جمع ولكن بدون أن نبني القطعة البرمجية الخاصة بها .
  • أيضا اعلنا عن دالة الطرح ولم نستخدمها أيضا .
  • اعلنا عن دالة الضرب وقمنا ببنائها وتمرير قيم ووضحنا عملها وهذا يدل ان interface ليس حكرا فقط لتجهيز الدوال والمتغيرات أيضا نستطيع بناء دالة كاملة، ولكن الاختلاف يكمن في طريقة العمل التي سنوضحها بعد قليل .
  • المتغيرات التي يتم تعريفها بداخل interface لا يتم اسناد قيم لها ابدا ، كما لاحظنا عرفنا متغير ولم نسند له قيم .

رابعاً:استخدام interface :-

interface لا يتم استخدامها مباشرة في الدالة الرئيسية وإنما نستخدمها بعملية implements وهي بالضبط مماثلة لعملية الوراثة ، هكذا :

نرى أنه عندما جعلنا التصنيف يرث من الـ interface قام بوضع خط احمر ، لماذا ؟ لأنه عندما تجعل التصنيف يرث من interface وبداخله دوال لم تبنى بعد فإجباري أن تدرجهم بداخل التصنيف كلهم أو أحدهم على الأقل ، حسنا ولكن كيف يعني ادرجهم ؟ بمعنى أن تقوم بعمل override للدالة كما تعلمنا مسبقا ، سنوضح ذلك الأن :-

  • بعد الضغط عليها نلاحظ أن يطلب  implement as constructor parameters في أول مرة ويقصد به أننا عرفنا متغير في interface فهنا يجب في التصنيف الوارث ان نستخدمه .

بعد إدراج المتغير :-

class operations(override var num1: Int) :myInterface{

}

  • implement members وهو يعني قم بإضافة الدوال التي عرفتها ولم تستخدمها ، وهنا ننوه بأنه إجباري استخدامها وكتابتها بما أنك قمت بجعل التصنيف يرث من interface ، أما الدالة الجاهزة الخاصة بعملية الضرب فنحن بنيناها في interface فلك الحرية بأن تستدعيها في التصنيف أو لا .

بعد إدراج الدوال  :-

class operations(override var num1: Int) :myInterface{
    override fun sub() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun sum() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}


خامساً:مثال  interface :-

interface myInterface{

    fun sum(num1:Int,num2:Int)
    fun sub(num1:Int,num2:Int)
    fun mul(num1:Int,num2:Int){
        var result = num1*num2
        println("the result :$result")
    }


}

class operations:myInterface{
    override fun sub(num1:Int,num2:Int) {
        var result = num1 - num2
        println("the result :$result")
    }

    override fun sum(num1:Int,num2:Int) {
        var result = num1 + num2
        println("the result :$result")
    }

    fun dev(num1:Int,num2:Int){
        var result = num1 / num2
        println("the result :$result")
    }

}

fun main(args:Array<String>){
    var op1 = operations()
    println("the result of sum :")
    op1.sum(4,3)
    println("the result of sub :")
    op1.sub(4,3)
    println("the result of mul :")
    op1.mul(3,4)
    println("the result of dev :")
    op1.dev(4,3)
}
ناتج التنفيذ :-

the result of sum :
the result :7
the result of sub :
the result :1
the result of mul :
the result :12
the result of dev :
the result :1