23- كورس Kotlin اندرويد بالعربي – Kotlin Class Inheritance

شرح مفصل لـ Kotlin Class Inheritance

فهم الوراثة في Kotlin

تعتبر الوراثة واحدة من المفاهيم الأساسية في البرمجة الكائنية (OOP) وتتيح لك إمكانية إعادة استخدام الشيفرة البرمجية وزيادة القابلية للتوسع والتنظيم. في لغة Kotlin، تُعتبر الوراثة ميزة قوية تسمح بإنشاء فئات (classes) تعتمد على فئات أخرى، مما يمكن المبرمجين من استعمال وظائف وخصائص الفئة الأم في الفئة المشتقة. يتم تحقيق الوراثة في Kotlin باستخدام الكلمة المفتاحية “open” للفئات الأم و”override” للوظائف المشتقة.

كيفية تطبيق الوراثة في Kotlin

لتمكين الوراثة في Kotlin، يجب أن تكون الفئة الأساسية (الأم) مفتوحة للتوريث. بشكل افتراضي، الفئات في Kotlin مغلقة ولا يمكن توريثها إلا إذا تم تحديدها باستخدام الكلمة المفتاحية “open”. عند إنشاء فئة جديدة تعتمد على فئة أخرى، يمكنك استخدام الكلمة “class” متبوعة باسم الفئة الجديدة، ثم استخدام الكلمة “:”, واسم الفئة الأساسية. على سبيل المثال، يمكننا إنشاء فئة “Vehicle” كفئة أساسية، ثم إنشاء فئة “Car” التي ترث منها.


        open class Vehicle {
            open fun start() {
                println("Vehicle is starting")
            }
        }

        class Car : Vehicle() {
            override fun start() {
                println("Car is starting")
            }
        }

في المثال أعلاه، نلاحظ أن فئة “Vehicle” مفتوحة للتوريث، وفئة “Car” ترث منها وتقوم بتجاوز الوظيفة “start” لتوفير تنفيذ مختلف.

فوائد واستخدامات الوراثة

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

بالإضافة إلى ذلك، يمكن استخدام الوراثة لتعزيز مفهوم تعدد الأشكال (Polymorphism)، حيث يمكن للفئة الواحدة أن تأخذ أشكالاً متعددة بناءً على السياق. على سبيل المثال، في كود تطبيق يمكن أن تكون هناك أنواع مختلفة من المركبات مثل “Car” و”Truck”، وكل منها يمكن أن يكون له تنفيذ مختلف لوظائف محددة مع الاحتفاظ بنفس الواجهة.


        fun main() {
            val myCar: Vehicle = Car()
            myCar.start() // Output: Car is starting
        }
 

المثال الأخير يعرض كيف يمكن لفئة “Car” أن تكون نوعاً من “Vehicle” واستخدام الوظيفة “start” المتجاوزة، مما يبرز مفهوم تعدد الأشكال بوضوح.