مفهوم generic variance في الكوتلن

سنقوم بشرح مبسط لفائدة out و in في الكوتلن

Ismail Ait Bellaمنذ 5 سنوات

لعل مفهوم 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 vs 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.

مفهوم Covariance

4-النوع الثاني => Contravariance :

هنا نحن نتحدث عن ضد الحالة السابقة لكن ليس العكس لنترك الكود و الصور يوضحان الامر .

و لتوضيح الامور هذا المفهوم غير مرتبط بالقوائم او List لكن اريد تقريب الفكرة فقط و الا Comparable هو الذي يتسعين ب ال (in) .

لنعكس السطرين السابقين :

//هذه طريقة خاطئة لعمل List
//الهدف هو الشرح فقط

//لاحظ اني مررت السيارات ل قائمة كيا
val carList: myList<Car> =myList()
val kiaList: myList<Kia> = carList // error : required kia found Car

مفهوم Contravariance

هنا لدينا نفس الاشكال السابق لكن هذه المرة نريد تمرير 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 

لا تنسى متابعتي على فايسبوك فانا انشر هناك اشياء مفيدة عن كوتلن من حين الى اخر

@Androidbella4

شرح خاصية operator

المصادر :

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/

لقد سولفت كثيرا او قليلا ان اعجبك البوست قم بمشاركته اذا تجاوز الالف مشاهدة ساقوم بالتحدث عن المفاهيم الموجودة في كوتلن .

4
إعجاب
2744
مشاهدات
0
مشاركة
2
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !