🚀 رحلتك في عالم الـ Classes في TypeScript

اليوم سننتقل إلى واحدة من أهم الركائز في عالم البرمجة الحديثة، وهي الـ Classes (الأصناف).

إذا كنت قد تعاملت مع الكائنات (Objects) من قبل، فستجد أن الـ Class هو ببساطة "المخطط" أو "القالب" الذي نستخدمه لإنشاء هذه الكائنات. تخيل أن الـ Class هو "رسم هندسي لمنزل"، بينما الـ Object هو "المنزل الفعلي" الذي تم بناؤه بناءً على ذلك الرسم. 🏠


🏗️ ما هو الـ Class بالضبط؟

الـ Class هو وسيلة لتجميع البيانات (Properties) والوظائف (Methods) التي تتعلق بشيء واحد في مكان واحد. بدلاً من تعريف كل كائن يدوياً، نقوم بإنشاء "كلاس" واحد، ثم ننتج منه مئات الكائنات المتشابهة في الهيكل ولكن المختلفة في القيم.

لماذا نستخدم الـ Classes؟

  1. التنظيم: تجعل الكود مرتباً وسهل القراءة.
  2. إعادة الاستخدام: تكتب الكود مرة واحدة وتستخدمه لإنشاء كائنات متعددة.
  3. النمذجة: تساعدك على تمثيل أشياء من الواقع (مثل: مستخدم، منتج، سيارة) داخل الكود.

🛠️ كيف ننشئ Class بسيط؟

لإنشاء كلاس في TypeScript، نستخدم الكلمة المحجوزة class متبوعة باسم الكلاس (ويفضل دائماً أن يبدأ بحرف كبير Capital Letter).

لنلقِ نظرة على هذا المثال البسيط لتمثيل "لاعب" في لعبة ما:

class Player {
    // الخصائص (Properties)
    playerName: string;
    score: number;

    // الدالة التي تقوم بتهيئة القيم (Constructor)
    constructor(name: string, initialScore: number) {
        this.playerName = name; // تعيين القيمة القادمة من الخارج للخاصية
        this.score = initialScore;
    }

    // الوظائف (Methods)
    displayInfo() {
        console.log("Player: " + this.playerName + " | Score: " + this.score);
    }
}

// إنشاء كائن (Object) من الكلاس
const player1 = new Player("Ahmed", 100);
const player2 = new Player("Sara", 250);

// استدعاء الدالة
player1.displayInfo(); // Output: Player: Ahmed | Score: 100
player2.displayInfo(); // Output: Player: Sara | Score: 250

🔍 تفصيل مكونات الكلاس (خطوة بخطوة)

دعنا نحلل الكود السابق لنفهم ماذا حدث بالضبط:

1. الخصائص (Properties) 📋

هي المتغيرات التي تصف الكائن. في مثالنا، كل لاعب يجب أن يمتلك playerName (نص) و score (رقم). في TypeScript، يجب أن نحدد نوع هذه الخصائص بوضوح.

2. المُنشئ (The Constructor) 🏗️

الـ constructor هو دالة خاصة جداً تُنفذ تلقائياً بمجرد كتابة كلمة new. وظيفتها الأساسية هي "تجهيز" الكائن وإعطاؤه قيمه الأولية.

3. الكلمة المفتاحية this 🔑

تلاحظ أننا استخدمنا this.playerName. كلمة this تعني: "أنا أتحدث عن الخاصية الموجودة داخل هذا الكائن الحالي"، لكي نفرق بين المتغير القادم من الخارج وبين خاصية الكلاس نفسه.

4. الوظائف (Methods) ⚙️

هي الدوال الموجودة داخل الكلاس. في مثالنا، دالة displayInfo هي وظيفة تابعة للاعب، تسمح له بطباعة معلوماته على الشاشة.


💡 مثال واقعي آخر: نظام إدارة الكتب 📚

تخيل أنك تبني تطبيقاً للمكتبة، ستحتاج لإنشاء كلاس يمثل "الكتاب".

class Book {
    title: string;
    author: string;
    pages: number;

    constructor(bookTitle: string, bookAuthor: string, bookPages: number) {
        this.title = bookTitle;
        this.author = bookAuthor;
        this.pages = bookPages;
    }

    getBookDetails() {
        return "Book: " + this.title + " written by " + this.author;
    }
}

// إنشاء كتب مختلفة باستخدام نفس القالب
const book1 = new Book("TypeScript Basics", "Codex Academy", 150);
const book2 = new Book("Clean Code", "Robert Martin", 400);

console.log(book1.getBookDetails()); // Book: TypeScript Basics written by Codex Academy
console.log(book2.getBookDetails()); // Book: Clean Code written by Robert Martin

⚠️ ملاحظات هامة للمبتدئين

  • كلمة new: لا يمكنك إنشاء كائن من الكلاس بدون استخدام new. بدونها، لن يتم استدعاء الـ constructor.
  • تسمية الكلاس: تذكر دائماً أن تبدأ اسم الكلاس بحرف كبير (مثلاً User وليس user) لتمييزه عن المتغيرات العادية.
  • الأنواع: قوة TypeScript تظهر هنا، فإذا حاولت تمرير "نص" في مكان "الرقم" داخل الـ constructor سيقوم المحرر بتنبيهك فوراً بوجود خطأ.

⏭️ ماذا سنتعلم في الدرس القادم؟

الآن بعد أن تعلمنا كيف نبني "قالب" بسيط باستخدام الـ Classes، قد تتساءل: "ماذا لو أردت إخفاء بعض البيانات لكي لا يتم تعديلها من خارج الكلاس بالخطأ؟"

في الدرس القادم، سنتعرف على Access Modifiers (محددات الوصول) مثل public, private, و protected لنضيف لمسة من الأمان والاحترافية على الكلاسات الخاصة بنا! 🛡️