OOP

🔹 البرمجة الكائنية (OOP) في Dart 🚀

🔹 البرمجة الكائنية التوجه (Object-Oriented Programming - OOP) هي نمط برمجي يعتمد على الكائنات (Objects)، التي تتكون من الخصائص (Properties) و الوظائف (Methods).

في Dart، يتم تنفيذ الـ OOP باستخدام الكلاسات (Classes) والأشياء (Objects).


🔹 1. تعريف Class (الكلاس)

🔹 Class هو قالب (Blueprint) لإنشاء الكائنات.
🔹 يحتوي على خصائص (Variables) و وظائف (Methods).
🔹 يتم إنشاء كائن (Object) من Class لاستخدامه.

📌 مثال: إنشاء Class باسم Person

dartنسختحرير<code>class Person {
  String name = "غير معروف";  // خاصية (Property)
  int age = 0;

  // دالة (Method)
  void introduce() {
    print("مرحبًا، أنا $name وعمري $age سنة.");
  }
}
</code>
Dart

🔹 التفسير:

  • name و age هما خصائص (Properties).
  • introduce() هي وظيفة (Method) تقوم بطباعة معلومات الشخص.

🔹 2. إنشاء Object (كائن)

بعد تعريف الكلاس، يمكننا إنشاء كائن (Object) واستخدامه.

📌 مثال: إنشاء كائن من Person

dartنسختحرير<code>void main() {
  Person person1 = Person(); // 🆕 إنشاء كائن
  person1.name = "أحمد";
  person1.age = 25;

  person1.introduce(); // استدعاء الدالة
}
</code>
Dart

الناتج:

نسختحريرمرحبًا، أنا أحمد وعمري 25 سنة.

🔹 التفسير:

  • Person person1 = Person(); يُنشئ كائنًا جديدًا من Person.
  • person1.name = "أحمد"; يقوم بتحديث الاسم.
  • person1.introduce(); يستدعي الوظيفة (Method).

🔹 3. المُنشئ (Constructor)

🔹 Constructor هو دالة خاصة تُستدعى عند إنشاء الكائن.
🔹 يمكننا استخدامه لتعيين القيم مباشرة عند الإنشاء.

📌 مثال: استخدام Constructor لتحديد الخصائص عند الإنشاء

dartنسختحرير<code>class Person {
  String name;
  int age;

  // المُنشئ (Constructor)
  Person(this.name, this.age);

  void introduce() {
    print("مرحبًا، أنا $name وعمري $age سنة.");
  }
}

void main() {
  Person person1 = Person("خالد", 30); // 👈 تمرير القيم مباشرة
  person1.introduce();
}
</code>
Dart

الناتج:

نسختحريرمرحبًا، أنا خالد وعمري 30 سنة.

🔹 التفسير:

  • Person(this.name, this.age); يقوم بتحديد القيم عند إنشاء الكائن.
  • لم نعد بحاجة إلى تعيين القيم يدويًا بعد الإنشاء.

🔹 4. المُنشئات المسماة (Named Constructors)

🔹 يمكننا إنشاء أكثر من منشئ (Constructor) باستخدام Named Constructors.

📌 مثال: إنشاء منشئات متعددة

dartنسختحرير<code>class Car {
  String brand;
  int year;

  // منشئ عادي
  Car(this.brand, this.year);

  // منشئ باسم (لإنشاء سيارة بدون سنة محددة)
  Car.onlyBrand(String brand) : this(brand, 2024);

  void info() {
    print("السيارة من نوع $brand، موديل $year.");
  }
}

void main() {
  Car car1 = Car("Toyota", 2020);
  car1.info();

  Car car2 = Car.onlyBrand("BMW");
  car2.info();
}
</code>
Dart

الناتج:

yamlنسختحريرالسيارة من نوع Toyota، موديل 2020.
السيارة من نوع BMW، موديل 2024.

🔹 التفسير:

  • Car.onlyBrand() هو منشئ مسمى (Named Constructor) يسمح بإنشاء سيارة بدون تحديد year.
  • this(brand, 2024); يستدعي المنشئ الأساسي مع تعيين year إلى 2024 تلقائيًا.

🔹 5. الوراثة (Inheritance)

🔹 تسمح Inheritance بإعادة استخدام كود الكلاسات عن طريق وراثة الخصائص والوظائف.

📌 مثال: Car ترث Vehicle

dartنسختحرير<code>class Vehicle {
  String brand;
  
  Vehicle(this.brand);

  void start() {
    print("$brand بدأت العمل!");
  }
}

// `Car` ترث `Vehicle`
class Car extends Vehicle {
  int year;

  Car(String brand, this.year) : super(brand);

  void info() {
    print("🚗 سيارة $brand موديل $year.");
  }
}

void main() {
  Car car1 = Car("Ford", 2023);
  car1.start(); // من الكلاس الأب
  car1.info();  // من الكلاس الابن
}
</code>
Dart

الناتج:

yamlنسختحريرFord بدأت العمل!
🚗 سيارة Ford موديل 2023.

🔹 التفسير:

  • extends Vehicle تعني أن Car ترث جميع خصائص ودوال Vehicle.
  • super(brand); يستدعي المُنشئ (Constructor) للكلاس الأب.

🔹 6. التجريد (Abstract Classes)

🔹 abstract class لا يمكن إنشاء كائنات منها مباشرة، بل تُستخدم كقالب (Blueprint) لكلاسات أخرى.

📌 مثال: abstract class

dartنسختحرير<code>abstract class Animal {
  void makeSound(); // دالة بدون تنفيذ
}

// وراثة الكلاس المجرد
class Dog extends Animal {
  @override
  void makeSound() {
    print("🐶 الكلب ينبح: هو هو!");
  }
}

void main() {
  Dog dog = Dog();
  dog.makeSound();
}
</code>
Dart

الناتج:

نسختحرير🐶 الكلب ينبح: هو هو!

🔹 التفسير:

  • abstract class Animal يحتوي على دالة بدون تنفيذ.
  • Dog يرث Animal ويجب أن ينفذ makeSound().

🎯 خلاصة البرمجة الكائنية (OOP) في Dart

Class → هو قالب يحتوي على خصائص (Properties) و وظائف (Methods).
Object → هو كائن يتم إنشاؤه من Class.
Constructor → دالة خاصة تنفذ عند إنشاء الكائن.
Named Constructor → لإنشاء منشئات متعددة.
Inheritance → تسمح لـ Class بوراثة Class آخر (extends).
Abstract Class → كلاس مجرد لا يمكن إنشاء كائن منه (abstract).