الفئات في TypeScript

الفئات في TypeScript

تشرح هذه المقالة الفئات في TypeScript۔

YouTube Video

الفئات في TypeScript

الفئات في TypeScript تعتمد على فئات JavaScript ES6 وتوفر ميزات إضافية مثل تعليقات النوع ومحددات الوصول۔ يتيح لك ذلك الاستفادة من مفاهيم البرمجة الشيئية مع ضمان أمان النوع بشكل أكثر قوة ووضوح۔

فيما يلي توضيحات للاستخدام الأساسي وميزات الفئات في TypeScript۔

تعريف الفئة الأساسية

 1class Person {
 2    name: string;  // Member variable
 3    age: number;   // Member variable
 4
 5    // Constructor
 6    constructor(name: string, age: number) {
 7        this.name = name;
 8        this.age = age;
 9    }
10
11    // Method
12    greet(): void {
13        console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
14    }
15}
16
17const person = new Person("Alice", 25);
18person.greet();  // Hello, my name is Alice and I am 25 years old.
  • name و age هما خصائص (متغيرات الأعضاء) للفئة۔
  • الـ constructor هو طريقة يتم استدعاؤها عند إنشاء مثيل لفئة، حيث تأخذ معاملات وتخصص القيم للخصائص۔
  • greet هو أسلوب للفئة، يشير إلى أنه ليس له قيمة إرجاع من خلال النوع void۔

محددات الوصول

في TypeScript، يمكنك استخدام محددات الوصول (public، private، protected) للتحكم في الوصول إلى خصائص وأساليب الفئة۔

public

بشكل افتراضي، جميع الخصائص والأساليب هي public۔ هذا يعني أنه يمكن الوصول إليها من خارج الفئة۔

 1class Animal {
 2    public species: string;
 3
 4    constructor(species: string) {
 5        this.species = species;
 6    }
 7
 8    public makeSound(): void {
 9        console.log(`${this.species} makes a sound.`);
10    }
11}
12
13const animal = new Animal("Dog");
14console.log(animal.species);  // Dog
15animal.makeSound();           // Dog makes a sound.
  • تم الإعلان عن خاصية species وطريقة makeSound كـ public ويمكن الوصول إليهما من خارج الفئة.۔

private

استخدام محدد private يمنع الوصول إلى الخصائص أو الأساليب من خارج الفئة۔

 1class Car {
 2    private brand: string;
 3
 4    constructor(brand: string) {
 5        this.brand = brand;
 6    }
 7
 8    public getBrand(): string {
 9        return this.brand;
10    }
11}
12
13const car = new Car("Toyota");
14// console.log(car.brand);  // Error: 'brand' is private and cannot be accessed.
15console.log(car.getBrand());  // Toyota
  • تم إعلان خاصية brand كـ private، لذلك لا يمكن الوصول إليها من خارج الفئة.۔
  • يمكن تحقيق تغليف البيانات عن طريق إخفاء الخصائص باستخدام المعدّل private

protected

محدد protected يقيد الوصول من خارج الفئة ولكنه يسمح به في الفئات الفرعية (الفئات المشتقة)۔

 1class Vehicle {
 2    protected model: string;
 3
 4    constructor(model: string) {
 5        this.model = model;
 6    }
 7}
 8
 9class Truck extends Vehicle {
10    public getModel(): string {
11        return this.model;
12    }
13}
14
15const truck = new Truck("Ford F-150");
16console.log(truck.getModel());  // Ford F-150
17
18// console.log(truck.model);
19// Error: Property 'model' is protected and only accessible within class 'Vehicle' and its subclasses.
  • تم إعلان خاصية model كـ protected، لذا لا يمكن الوصول إليها من خارج الفئة، ولكن يمكن الوصول إليها من الفئات الفرعية.۔

الوصول والاستبدال (Getters و Setters)

في TypeScript، يمكنك تعريف الوصول والاستبدال باستخدام الكلمات الرئيسية get و set لاسترجاع وتعيين قيم الخصائص۔

 1class Employee {
 2    private _salary: number;
 3
 4    constructor(salary: number) {
 5        this._salary = salary;
 6    }
 7
 8    // Getter
 9    get salary(): number {
10        return this._salary;
11    }
12
13    // Setter
14    set salary(newSalary: number) {
15        if (newSalary > 0) {
16            this._salary = newSalary;
17        } else {
18            console.log("Salary must be positive.");
19        }
20    }
21}
22
23const employee = new Employee(50000);
24console.log(employee.salary);  // 50000
25employee.salary = 60000;
26console.log(employee.salary);  // 60000
27employee.salary = -100;        // Salary must be positive.
  • في هذا المثال، تم استخدام getter و setter لخاصية salary للتحكم في الوصول والتحديثات الخارجية.۔ يقوم الـ setter بإجراء التحقق لمنع القيم السلبية، ويعرض رسالة تحذير إذا تم تقديم قيمة غير صالحة.۔

الوراثة

في TypeScript، يمكن توريث الفئات۔ باستخدام الكلمة الرئيسية extends، يمكنك وراثة الوظائف من فئة رئيسية۔

 1class Animal {
 2    constructor(public name: string) {}
 3
 4    public move(): void {
 5        console.log(`${this.name} is moving.`);
 6    }
 7}
 8
 9class Bird extends Animal {
10    public fly(): void {
11        console.log(`${this.name} is flying.`);
12    }
13}
14
15const bird = new Bird("Sparrow");
16bird.move();  // Sparrow is moving.
17bird.fly();   // Sparrow is flying.
  • في هذا المثال، ترث فئة Bird من فئة Animal، ممّا يتيح لها استخدام طريقة move الخاصة بـ Animal.۔ بالإضافة إلى ذلك، تقوم بتعريف طريقتها الخاصة fly، مما يضيف وظائف جديدة مع وراثة ميزات من الفئة الأم.۔

الفئات التجريدية

الفئات التجريدية (abstract) لا يمكن إنشاء مثيل لها مباشرة، وتستخدم كقوالب لتوفير تطبيقات محددة في الفئات الفرعية۔

 1abstract class Shape {
 2    abstract getArea(): number;
 3
 4    public describe(): void {
 5        console.log("This is a shape.");
 6    }
 7}
 8
 9class Circle extends Shape {
10    constructor(private radius: number) {
11        super();
12    }
13
14    public getArea(): number {
15        return Math.PI * this.radius * this.radius;
16    }
17}
18
19const circle = new Circle(5);
20console.log(circle.getArea());  // 78.53981633974483
21circle.describe();  // This is a shape.
  • في هذا المثال، تم تعريف Shape كفئة مجردة، و getArea هي طريقة مجردة يجب أن يتم تنفيذها بواسطة الفئات الفرعية.۔ ترث فئة Circle هذه الفئة المجردة وتنفذ طريقتها الخاصة getArea لحساب مساحة الدائرة.۔ بالإضافة إلى ذلك، يتم وراثة الطرق الملموسة مثل describe كوظائف مشتركة ويمكن استخدامها كما هي.۔

العلاقة مع الواجهات

يمكن للفئات تنفيذ واجهات، مما يضمن أنها تحتوي على خصائص وأساليب معينة۔

 1interface Flyable {
 2    fly(): void;
 3}
 4
 5class Airplane implements Flyable {
 6    public fly(): void {
 7        console.log("The airplane is flying.");
 8    }
 9}
10
11const airplane: Flyable = new Airplane();
12airplane.fly();  // The airplane is flying.
  • في هذا المثال، يحدد واجه Flyable مواصفات لطريقة fly، وتقوم فئة Airplane بتنفيذ هذا الواجه من خلال تقديم تعريف فعلي لطريقة fly.۔ بهذا، يتم ضمان وجود طريقة fly في أي كائن يمكن معاملته كنوع Flyable

الأعضاء الساكنة

عند تعريف الأعضاء الساكنة في فئة، تُرتبط تلك الطرق والخصائص بالفئة نفسها.۔ يمكن استدعاء الأعضاء الساكنة دون إنشاء كائن من الفئة.۔

 1class MathUtils {
 2    static PI: number = 3.14;
 3
 4    static add(a: number, b: number): number {
 5        return a + b;
 6    }
 7}
 8
 9console.log(MathUtils.add(10, 20)); // 30
10console.log(MathUtils.PI); // 3.14
  • تعرّف الطرق الساكنة باستخدام الكلمة المفتاحية static
  • في هذا المثال، تعرف فئة MathUtils طريقة ساكنة باسم add وخاصية ساكنة باسم PI
  • الأعضاء الساكنة لا تنتمي إلى كائنات الفئة، ولكن يمكن استدعاؤها مباشرةً من الفئة نفسها.۔

الملخص

تضيف فصول TypeScript ميزات مثل الأمان من النوع، معدلات الوصول، والفصول المجردة إلى وظائف الفصول في JavaScript۔ يسمح ذلك ببرمجة كائنية التوجه أكثر قوة وأماناً۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video