Companion object

أولاً:مفهوم companion object :-

هذا المفهوم يعبر عن إمكانية وصولك لدوال و متغيرات معينة تم تعريفها بداخل التصنيف بدون اشتقاق كائن، هذه المتغيرات عملها مستقل عن ما بداخل التصنيف يعني أنني انشأتها لعمل معين بدون ان ترتبط بالمتغيرات الأخرى أو الدوال التي بداخل التصنيف ، ويتم تعريف هذه المتغيرات والدوال بداخل قطعة برمجية تسمى companion object  .


 ثانياًِ:طريقة كتابته :-

companion object {

}

 ثالثاً:مثال :-

class labtop {

        companion object {
                fun sayHello(){
                        println("Welcome in my project")
                    }
               
            }
         var serialNum:Int = 0
         var company:String = " "
       
          fun getData(){
                  println(" labtop : $company \n the serial number is : $serialNum")
              }
       
}

 ستلاحظ بأنها  قطعة برمجية مستقلة انشأنا بداخلها دالة تقوم بالترحيب ، كما قلنا أنه ما يتم كتابته بداخل هذه القطعة لن تستخدمه خارجه أي أنه لا علاقة له بمحتويات التصنيف الباقية .

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

نلاحظ أننا قمنا بكتابة اسم التصنيف class ومن ثم ظهرت لنا الدالة التي انشأناها بداخل companion object وهنا يتجلى لنا الهدف منها أننا نستطيع ان نضع العمليات والمتغيرات بداخل هذه القطعة البرمجية للوصول إليها سريعا من اسم التصنيف .

هنا قمنا باشتقاق كائن من التصنيف ونلاحظ أنه لا يستطيع الوصول إلى ما بداخل companion object .


رابعاً:متغير يستقبل companion object :-

نستطيع أن نعرف متغير في الدالة الرئيسية قيمته عبارة عن companion object هكذا :

var quiz: Float = 0f
var midterm: Float = 0f
var final: Float = 0f
class student {

    companion object {

        fun totalQuiz() {
            println("Enter first Degree : ")
            var quiz1: Float = readLine()!!.toFloat()
            println("Enter second Degree : ")
            var quiz2: Float = readLine()!!.toFloat()
            var totalQuiz: Float = (quiz1 + quiz2) / 2
            println("your quiz degree is : $totalQuiz")
        }

        fun totalDegree(quiz: Float, midterm: Float, final: Float) {
            var result = quiz + midterm + final

            if (result >= 90 && result <= 100) {
                println("A")
            } else if (result >= 80 && result <= 89) {
                println("B")
            } else if (result >= 70 && result <= 79) {
                println("C")
            } else if (result >= 60 && result <= 69) {
                println("D")
            } else {
                println("F")
            }
        }
    }


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

fun main(args:Array<String>){

    var tQuiz = student.Companion

    tQuiz.totalQuiz()
}

نعرف متغير ونرى أننا اسندنا له companion object .


 

خامساً:معلومات حول companion object :-

في حال أننا عرفنا متغيرات بداخله واسندنا لها قيم فإنه عند استدعائها وتغير قيمتها في البرنامج سوف تتغير بشكل عام أي ليس في الأمر فقط المحدد ، سنوضح ذلك :-
class compan {

    companion object {
        var yourName = "Ahmed"
        var familyName = "Aljuaid"
        fun show() {
            println("Hello $yourName $familyName")
        }
    }

    var yourName = "Ahmed"
    var familyName = "Aljuaid"
    fun show() {
        println("Hello $yourName $familyName")
    }
}
fun main(args:Array<String>){

    var name = compan.Companion
    var name1 = compan.Companion

    name.show()
    name1.show()

}

التنفيذ :-

Hello Ahmed Aljuaid
Hello Ahmed Aljuaid

حسنا لنلاحظ قليلا  لو أردنا تغير الاسم الأول في متغير name ما لذي سيحدث ، في الدالة الرئيسية :-

fun main(args:Array<String>){

    var name = compan.Companion
    var name1 = compan.Companion

    name.yourName="Ali"
    name.show()
    name1.show()

}

التنفيذ :-

Hello Ali Aljuaid
Hello Ali Aljuaid

تم تغيير الاسم في المتغيرين name and nam1 بالرغم من أننا استدعينا name وعدلنا بها ، وهذا يدل على أنه غير مستقل بحيث أنه  قيمة متغير في كائن واحد يجعلك عندما تستدعي نفس المتغير لكائن جديد هيا نفسها القيمة .