OOP Abstract Class In dart

✅ أولًا: ما هو الـ Abstract Class؟
🔹 التعريف:

Abstract Class هو كلاس لا يمكن إنشاء كائن (object) منه مباشرة، يُستخدم كـ قالب (Template) لكلاسات أخرى ترث منه وتقوم بتنفيذ (تطبيق) ما يلزم من الدوال.

🔹 الهدف منه:
  • إجبار الكلاسات الأبناء على تطبيق (implement) بعض الدوال.
  • توفير قاعدة مشتركة من الخصائص والدوال.
✅ الشكل العام:
abstract class ClassName {
  void method(); // مجردة
}
Dart
✅ ملاحظات مهمة:
الخاصيةهل تنطبق؟
❌ لا يمكن إنشاء كائن منه
✅ يمكن أن يحتوي على دوال بدون جسم (abstract)
✅ يمكن أن يحتوي على دوال عادية أيضًا
✅ يمكن أن يحتوي على خصائص
✅ مثال 1: كلاس مجرد يحتوي دوال مجردة فقط
abstract class Employee {
  void work(); // دالة مجردة لا تحتوي على جسم
}

class Manager extends Employee {
  @override
  void work() {
    print("يدير الفريق ويضع الخطط 🗂️");
  }
}

class Developer extends Employee {
  @override
  void work() {
    print("يكتب الكود ويطور التطبيقات 💻");
  }
}

void main() {
  Employee e1 = Manager();
  Employee e2 = Developer();

  e1.work(); // يدير الفريق ويضع الخطط 🗂️
  e2.work(); // يكتب الكود ويطور التطبيقات 💻
}
Dart
✅ شرح المثال:
  • Employee هو كلاس مجرد abstract class فيه دالة work() بدون جسم.
  • Manager و Developer ورثوا منه ونفذوا دالة work بطريقتهم.
  • وقت التنفيذ، كل كائن يعمل بحسب وظيفته.
✅ مثال 2: كلاس مجرد يحتوي خصائص ودوال عادية
abstract class Shape {
  String color;

  Shape(this.color);

  void draw(); // مجردة

  void printColor() {
    print("لون الشكل هو: $color");
  }
}

class Circle extends Shape {
  Circle(String color) : super(color);

  @override
  void draw() {
    print("رسم دائرة");
  }
}

void main() {
  Circle c = Circle("أحمر");
  c.draw();         // رسم دائرة
  c.printColor();   // لون الشكل هو: أحمر
}
Dart
✅ الفروقات بين الكلاسات العادية و abstract
الكلاس العاديالكلاس المجرد
يمكن إنشاء كائن منهلا يمكن
ليس بالضرورة أن يرث منه أحدالهدف منه أن يتم توريثه
لا يحتوي على دوال مجردةقد يحتوي
ليس له قيود على الأبناءيجبر الأبناء على تنفيذ بعض الدوال
✅ أين نستخدم abstract class؟ (أماكن الاستخدام):
الحالةالوصفمثال
🧱 قاعدة عامةلما يكون عندك خصائص مشتركة بين عدة كائناتكائنات Animal أو Shape
🧪 نماذج تصميم (Design Patterns)مثل Template Pattern أو Strategyتنفيذ متعدد بمرجعية واحدة
🔐 في الأنظمة المعقدةمثل أنظمة تسجيل الدخول: كل نوع مستخدم يرث من UserBaseAdminUser, NormalUser
📱 في التطبيقات متعددة الواجهاتلفصل شكل العرض عن المنطقواجهات متعددة تشترك بسلوك
✅ مثال 3: Abstract في نظام دخول المستخدمين
abstract class User {
  String name;

  User(this.name);

  void login(); // يجب أن تطبقه كل فئة
}

class AdminUser extends User {
  AdminUser(String name) : super(name);

  @override
  void login() {
    print("الدخول كمدير: $name");
  }
}

class NormalUser extends User {
  NormalUser(String name) : super(name);

  @override
  void login() {
    print("الدخول كمستخدم عادي: $name");
  }
}

void main() {
  User u1 = AdminUser("أحمد");
  User u2 = NormalUser("سارة");

  u1.login(); // الدخول كمدير: أحمد
  u2.login(); // الدخول كمستخدم عادي: سارة
}
Dart
✅ مثال 4: واجهات عرض تعتمد على قالب مجرد
abstract class Screen {
  void buildHeader();
  void buildBody();

  void render() {
    buildHeader();
    buildBody();
  }
}

class HomeScreen extends Screen {
  @override
  void buildHeader() {
    print("عرض شريط العنوان الرئيسي");
  }

  @override
  void buildBody() {
    print("عرض محتوى الصفحة الرئيسية");
  }
}

void main() {
  Screen screen = HomeScreen();
  screen.render();
  // عرض شريط العنوان الرئيسي
  // عرض محتوى الصفحة الرئيسية
}
Dart
✅ خلاصة شاملة:
عنصرتفاصيل
ما هو؟كلاس لا يمكن إنشاء كائن منه
متى نستخدمه؟عندما نريد فرض سلوك مشترك على الكلاسات الأبناء
يحتوي على؟خصائص، دوال مجردة، دوال عادية
لماذا؟لتنظيم الكود، إعادة استخدامه، فرض قواعد ثابتة
الفرق عن العادي؟لا يمكن إنشاء كائن منه + يجبر الأبناء على تنفيذ ما يلزم