مفهوم generic variance في الكوتلن
سنقوم بشرح مبسط لفائدة out و in في الكوتلن
لعل مفهوم generic مفهوم مريب حتى بالنسبة للمحترفين لكن هذا لا يعني الا نحاول فهمه ، و اليوم لست هنا لاسولف عن Generic بحد ذاته و انما جزئية منه و هي generic variance و لعلك قد رايت شيئا كهذا myclass<out T> او myclass<in T> لدى فيتوجب عليك ان تكون عارفا باساسيات Generic من قبل و انصح بتفقد هذا الدورة من اكادمية حسونة ، حتى اذا لم تفهم لا تقلق فانا حدث معي نفس الشيء في بداياتي لكن حاول البحث عن الموضوع كثيرا ربما يكون لك مفيدا .
0-لماذا كوتلن :
حسنا الامر ليس مختلفا كثيرا مع الجافا او C# لكنني اخترت كوتلن لتحفيزك للانتقال اليها لاكون صريحا مع مختلف اللغات التي رايتها كوتلن كانت الافضل و بدون منازع من حيث شكل الكود و يفترض ان تكتسح مجالات اخرى قريبا .اعلم جيدا ان الجافاويين كثيرون و ان تدوينتي ستصل لكثرين ان كتبتها بالجافا لكن ساجبرهم على الالتحاق بنا .
1-الوراثة :
واحد من اشهر مفاهيم OOP او البرمجة كائنية التوجه هي الوراثة و هو مفهوم بسيط و مفيد الى ابعد درجة :
لنفترض ان لدينا
//الاب
open class Car(val speed:Int)
//الابن
class Kia(selfDrive:Boolean): Car(100)
//الابن
class Fiat(AI:Boolean): Car(150)
لهذا لا مشكلة لدينا ان قمنا بعمل assign = لابن على الاب هكذا
val newCar=Kia(true)
val car:Car=newCar
جميل اليس كذلك لكن دعنا نضف بعض التشويق اليه :
2- Class vs Type
حسنا لنجرب وضعهما في لست من انشائي انا :
//احب هذا الكلاس
class myList<T>
الامر سيكون هكذا :
val kiaList: myList<Kia> =myList()
val carList: myList<Car> = kiaList //Error : Required myList<Car> found myList<Kia>
تهانينا كنا نرغب في بعض التشويق و بالمقابل حصلنا على Error انها البرمجة يا سادة .
لماذا حصلنا على error لتعرف ذلك يجب ان تعرف الفرق بين Class و Type و Object او فقط بين Class و Type =>
كل كلاس هو type و لكن العكس غ صحيح حسنا String? هل هو كلاس او لا الاجابة الصحيحة لا هو type نعم نعلم جميعا ان List هو كلاس لكن List<String > هو type ببساطة انظر للجدول :
class | type | |
YES | YES | String |
NO | YES | String? |
YES | YES | List |
NO | YES | List<String> |
لهذا فما قمنا به نحن هنا جريمة في حق البرمجة امزح امزح ما قمنا به اننا مررنا subType ل Type (و ليس subClass ل Class) و بما اننا فعلنا ذلك فنحن نستحق الحصول على هذا الخطا الشنيع .
لنرى الان النوع الاول من varaince و بالعربية التغايير لا علم ان كانت الترجمة صحيحة او لا .
3-النوع الاول => Covariance :
لنرى الان حل المشكلة بين ما هو باضافة keyword بسيطة جميلة رائعة و هي out هنا :
class myList<out T>
val kiaList: myList<Kia> =myList()
val carList: myList<Car> = kiaList //no Error. ^_^
احزر ما دور out هنا نعم صحيح هي تخبر compiler ان B هو subType ل A و بهذا نكون استطعنا فعلها دون اية مشكلة قائمة kia يمكن ان تكون قائمة Car و هذل ما يسمى ب Covariance.
4-النوع الثاني => Contravariance :
هنا نحن نتحدث عن ضد الحالة السابقة لكن ليس العكس لنترك الكود و الصور يوضحان الامر .
و لتوضيح الامور هذا المفهوم غير مرتبط بالقوائم او List لكن اريد تقريب الفكرة فقط و الا Comparable هو الذي يتسعين ب ال (in) .
لنعكس السطرين السابقين :
//هذه طريقة خاطئة لعمل List
//الهدف هو الشرح فقط
//لاحظ اني مررت السيارات ل قائمة كيا
val carList: myList<Car> =myList()
val kiaList: myList<Kia> = carList // error : required kia found Car
هنا لدينا نفس الاشكال السابق لكن هذه المرة نريد تمرير superType ل subType و هذا غير مقبول نوعا ما الا مع اضافة in <= keyword
//Contravariance
class myList<in T>
val carList: myList<Car> =myList()
val kiaList: myList<Kia> = carList
هذان هما نوعا variance و لهذا ايضا مقابله ويسمى Invariance و هي الحالة التي لا نحتاج فيها الى in و out .
قد تتسائل ما الفائدة منهما لكن لهما فوائد كثيرة منها التقييد اما بالسوبر تايب او الساب تايب و ايضا يمكنك تفادي المشاكل التي تقع اثناء runtime واضهارها على ide رغم ان هذا موجود بالجافا الا انه غير مستغل بالشكل الموجود في كوتلن فكوتلن امنة اكثر و تمنعك من كتابة الكود بشكل خاطئ بمثل هذه الخواص .
ان كنت ترغب في التعرف على مثال حقيقي فان الانترفيس List يستعين ب out و Comparable يستعين ب in
لا تنسى متابعتي على فايسبوك فانا انشر هناك اشياء مفيدة عن كوتلن من حين الى اخر
المصادر :
https://kotlinlang.org/docs/reference/generics.html?q=&p=0
https://proandroiddev.com/understanding-generics-and-variance-in-kotlin-714c14564c47
https://blog.kotlin-academy.com/kotlin-generics-variance-modifiers-36b82c7caa39
https://medium.com/@elye.project/in-and-out-type-variant-of-kotlin-587e4fa2944c
https://stackoverflow.com/questions/44298702/what-is-out-keyword-in-kotlin
https://kotlinexpertise.com/kotlin-generics-and-variance-vs-java/
لقد سولفت كثيرا او قليلا ان اعجبك البوست قم بمشاركته اذا تجاوز الالف مشاهدة ساقوم بالتحدث عن المفاهيم الموجودة في كوتلن .
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !