تعلّم البرمجة بلغة كوتلن (23): إنشاء الأصناف Classes

تعلّم البرمجة بلغة كوتلن (23): إنشاء الأصناف Classes
أستمع الى المقال

تحدثنا في الدرس السابق، عن مفهوم الكائنات في البرمجة ومدى ارتباطها بالكائنات في حياتنا اليومية. واستعرضنا أيضًا، كيفية تكوين كائن من الأصناف الجاهزة، مثل: (String, Int, IntRange …etc) التي تأتي مرفقة مع لغة كوتلن. وقلنا أن هذه الأصناف يُمثل كل منها نوع من أنواع البيانات، ﻷنه يمكننا من تخزين نوع معين من البيانات في الذاكرة، ويوفر في الوقت ذاته خاصيات (متغيرات) Properties ووظائف (دوال) Functions، تساعدنا في إجراء العمليات عليها.

وبالرغم من أن هذه الأصناف الجاهزة تغطي أشياء كثيرة، ولكننا كثيرًا ما نحتاج إلى إنشاء أصناف جديدة، تعالج مشكلات خاصة ببرنامجنا.

إنشاء الأصناف Classes:

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

ويكون إنشاء الصنف في أبسط صوره، هو باستخدام الكلمة المفتاحية class وبعدها الاسم الذي اخترناه للصنف، كالتالي:

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

بعد الاسم، فتحنا قوسين معقوفين { } لنضع بهما الخاصيات properties والوظائف functions للصنف. أما إذا أردنا عدم وضعها وترك الصنف فارغًا، فيمكننا في كوتلن حذف القوسين، كالتالي:

class Mobile

إنشاء الكائنات:

الهدف من إنشاء صنف جديد، هو إنشاء نوع بيانات جديد لا يوجد في مكتبة كوتلن القياسية. لتخزين الصنف الجديد في الذاكرة، سنعلن عن متغير ونسند إليه الصنف. وسيكون الصنف الجديد، هو نوع بيانات المتغير، كالتالي:

val mobile: Mobile = Mobile()

اتبعنا طريقة الإعلان عن المتغيرات، بدءًا بالكلمة val ثم اسم المتغير mobile، ثم نوع بيانات المتغير وهو هنا الصنف Mobile، وعلامة الإسناد ( = )، وأخيرًا القيمة المراد إسنادها، والتي يُمثلها هنا كائن من نوع بياناتنا الجديد Mobile. ونلاحظ أيضًا، أننا استخدمنا القوسين بنفس طريقة استدعاء الدوال، ﻷن هذه هي طريقة إنشاء كائن من الصنف في كوتلن.

وكما نعرف من درس أنواع البيانات، يمكننا عدم ذكر نوع البيانات صراحًة، ﻷن كوتلن ستستنتج ذلك على كل حال، كالتالي:

val mobile = Mobile()

وسيكون نوع بيانات المتغير mobile هو الصنف Mobile في هذه الحالة أيضًا دون تغيير.

أعضاء الصنف Class members:

تنتمي كل المتغيرات (الخاصيات) properties والدوال (الوظائف) functions التي يتم إنشاؤها داخل صنف معين، إلى ذلك الصنف. ولا يمكن استخدامها أو التعامل معها، بدون إنشاء كائن من الصنف الذي تنتمي إليه.

مع ملاحظة أن وضعها داخل الصنف، هو شيء اختياري في كوتلن. ويمكننا إنشاء صنف بدونها كما رأينا في الفقرة السابقة مع الصنف Mobile.

كتابة خاصيات الصنف Mobile:

نعلن عن الخاصيات properties، بنفس طريقة الإعلان عن المتغيرات. باستخدام كلمتي var أو val، وإسناد قيمة لهذه الخاصية. سواء كانت هذه القيمة من أنواع البيانات الأساسية، أو قيمة من صنف جديد أنشأناه بأنفسنا، بما في ذلك الصنف نفسه الذي توجد بداخله الخاصية.

وحينما نفكر في الخاصيات التي يمكن أن يُمثلها أي جوال، نجد أن بعضها سيكون كالتالي:

  • الشركة Company: سنضع بهذه الخاصية اسم الشركة المنتجة للجوّال. وﻷن الاسم عبارة عن سلسلة من المحارف، سنعلن عن متغير من نوع String.
  • الطراز Model: الاسم التجاري للجوّال، وهو في الغالب من النوع String.
  • اللون Color: لون الجوّال هو أيضًا من النوع String.
  • حجم الذاكرة Memory Size: يأتي حجم الذاكرة غالبًا في شكل عدد صحيح، لذا يمكننا استخدام نوع البيانات Int.
  • حجم الشاشة Screen Size: يأتي حجم الشاشة غالبًا في شكل عدد كسري، لذا يمكننا استخدام نوع البيانات Double.

الآن يمكننا تطبيق كل السابق في الصنف Mobile، كالتالي:

وضعنا في الشفرة أعلاه، بيانات ابتدائية لكل خاصية من خاصيات الصنف. هذا ﻷننا لا نعرف بعد ما هو الكائن الذي سيتم إنشاؤه عبر استخدام هذا الكائن. لذلك توجب إعلان الخاصيات باستخدام الكلمة var، لنتمكن من تغيير البيانات لاحقًا عند إنشاء كائنات من الصنف Mobile.

الوصول إلى خصائص الصنف Accessing properties:

كما رأينا في الدرس السابق، للوصول إلى خصائص الصنف Mobile وطباعة قيمتها، يمكننا أولًا إنشاء كائن من الصنف Mobile، وإسناده إلى متغير. ثم وضع نقطة ( . ) بعد اسم المتغير، وكتابة اسم الخاصية التي نريدها، كالتالي:

عند تنفيذ الشفرة السابقة، نجد أن دالة الطباعة طبعت القيمة Unknown. وهذه هي القيمة الافتراضية التي وضعناها للخاصية company في الصنف Mobile.

تغيير قيم الخاصيات:

بالطبع ليس هدفنا من إنشاء الصنف Mobile، طباعة قيم خصائصه الافتراضية. بل إنشاء كائنات مختلفة ترث خصائص الصنف وتغير قيمها حسب ما يناسبها. ولفهم ذلك بصورة أوضح، إذا كان لدينا جوّالان من شركتين مختلفتين، فسننشئ كائن مختلف لكل واحد منهما كالتالي:

أنشأنا كائن سامسونغ ووضعنا له قيم خاصة به، وكائن آخر آيفون ووضعنا له القيم الخاصة به، باستخدام نفس الصنف Mobile. ثم وضعنا المتغيرين لطباعة قيمهما عبر دالة الطباعة. وعند تنفيذ الشفرة أعلاه، نجد أنه تم طباعة شيء يشبه التالي:

Mobile@27716f4

Mobile@8efb846

السطران يُمثلان عناوين الكائنين في الذاكرة. فما قبل العلامة @ هو نوع الكائن، وما بعدها هو رقم يُمثل عنوان الكائن في ذاكرة الحاسب. نلاحظ أن الرقم يحوي حروف وارقام، وهذا ﻷنه رقم من النظام الست عشري (شرحنا النظام الست عشري في مقالة منفصلة).

من هنا نعرف أنه لن نستطيع في هذه الحالة طباعة قيم الكائن بوضع المتغير الذي يُمثله مباشرة في دالة الطباعة. لطباعة كل القيم لكلا الكائنين، يمكننا استخدام طريقة القوالب النصية في كوتلن، ووضع كل القيم داخل دالة الطباعة، كالتالي:

println(“The ${samsung.color} ${samsung.model} from ${samsung.company} has ${samsung.memSize} Memory Size and ${samsung.screenSize} Screen Size”)

println(“The ${iPhone.color} ${iPhone.model} from ${iPhone.company} has ${iPhone.memSize} Memory Size and ${iPhone.screenSize} Screen Size”)

وستكون نتيجة الطباعة، كما يظهر في الصورة التالية:

إضافة وظائف للصنف Mobile:

من ضمن الوظائف المشتركة بين الجوّالات، هي وظيفة الإتصال Call. يمكننا إذًا إضافة هذه الوظيفة للصنف Mobile، كالتالي:

أنشأنا دالة اسميناها call وجعلناها تستقبل معامل parameter من النوع Mobile. ثم جعلنا الدالة تعيد نص String باستخدام طريقة القوالب النصية في كوتلن.

لا يتم استدعاء هذه الدالة مثل الدوال العادية ذات المستوى العالي Top-level functions والتي تكون مستقلة بنفسها مثل التي أنشأناها في درس الدوال. بل يتم استدعاؤها، بنفس طريقة الوصول إلى خاصيات الصنف. أي بوضع نقطة ( . ) بعد اسم المتغير الذي يُمثل الكائن، ثم كتابة اسم الدالة. ﻷنها مثل الخاصيات عبارة دوال منتمية  إلى صنف معين Member functions، بالتالي مرتبطة بهذا الصنف.

عند استدعاء هذه الدالة، يجب أن نضع لها قيمة argument لمعاملها ويكون من النوع Mobile حصريًا، كالتالي:

عند تنفيذ الشفرة أعلاه، سينتج لنا التالي:

Calling with s9 plus from the company Samsung

Calling with iPhone X from the company Apple

وهذا ﻷن دالة call استخدمت في المرة الأولى الكائن mobile1، لتعويض قيم المتغيرات في النص الذي تعيد قيمته. وفي المرة الثانية الكائن mobile2.

هذا الدرس هو جزء من سلسلة تعليم مبادئ البرمجة بلغة كوتلن. لمُتابعة الدروس منذ البداية ومُشاهدة فهرس المحتويات يمكنك الانتقال إلى الدرس الأول من هنا.

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.