Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المنشئ الافتراضي

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 10 من 110.

عندما لا تقوم بتعريف أي constructor في class، فإن Dart توفر تلقائيًا default constructor. هذا عبارة عن constructor بدون parameters يقوم ببساطة بإنشاء instance من الـ class.

class Book {
  String title = 'Unknown';
  int pages = 0;
}

// توفر Dart منشئًا افتراضيًا: Book()
Book myBook = Book();
print(myBook.title); // Unknown

المُنشئ الافتراضي (default constructor) غير مرئي في الكود الخاص بك، ولكنه موجود. فهو لا يأخذ أي وسائط (arguments) ويقوم بتهيئة الكائن بأي قيم افتراضية قمت بتعيينها لمتغيرات المثيل (instance variables).

بمجرد تعريف المنشئ (constructor) الخاص بك، لن يتم توفير المنشئ الافتراضي تلقائيًا. إذا كنت لا تزال ترغب في وجود منشئ بدون وسائط (no-argument constructor) إلى جانب المنشئ ذو الوسائط (parameterized one)، فيجب عليك إنشاؤه صراحةً:

class Book {
  String title;
  int pages;

  // منشئ افتراضي صريح
  Book() : title = 'Unknown', pages = 0;

  // منشئ بمعاملات
  Book.withDetails(this.title, this.pages);
}

Book book1 = Book();                      // يستخدم الافتراضي
Book book2 = Book.withDetails('Dart', 300); // يستخدم المعاملات

يستخدم المنشئ الافتراضي الصريح (explicit default constructor) قائمة تهيئة (الجزء الذي يلي النقطتين الرأسيتين) لتعيين القيم الأولية. هذا النمط مفيد عندما تريد توفير طرق متعددة لإنشاء كائنات (objects) من نفس الفئة (class).

challenge icon

التحدي

سهل

لنقم ببناء نظام جرد منتجات بسيط يوضح كلاً من المنشئات الافتراضية الضمنية والصريحة.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • product.dart: قم بتعريف فئة Product التي توفر طريقتين لإنشاء المنتجات:
    • منشئ افتراضي صريح Product() يقوم بتهيئة name إلى 'Unnamed' و price إلى 0.0 باستخدام قائمة تهيئة (initializer list)
    • منشئ مسمى Product.withDetails يقبل معاملات name و price
    • طريقة display() تطبع: Product: [name] - $[price]
  • main.dart: استورد فئة المنتج الخاصة بك وقم بإنشاء منتجين:
    • واحد باستخدام المنشئ الافتراضي
    • واحد باستخدام المنشئ المسمى مع 'Laptop' و 999.99
    استدعِ display() لكل منتج.

يجب أن تحتوي فئة Product الخاصة بك على متغيرين للمثيل (instance variables):

  • String name
  • double price

تنسيق المخرجات المتوقع:

Product: Unnamed - $0.0
Product: Laptop - $999.99

ورقة مرجعية

عندما لا يتم تعريف مُنشئ (constructor) في فئة (class)، توفر Dart تلقائيًا مُنشئًا افتراضيًا بدون معلمات:

class Book {
  String title = 'Unknown';
  int pages = 0;
}

Book myBook = Book(); // يستخدم المُنشئ الافتراضي الضمني
print(myBook.title); // Unknown

بمجرد تعريف المُنشئ الخاص بك، لن يتم توفير المُنشئ الافتراضي تلقائيًا. للحصول على كل من مُنشئ بدون وسائط ومُنشئ بمعلمات، يجب عليك إنشاؤهما صراحةً:

class Book {
  String title;
  int pages;

  // مُنشئ افتراضي صريح مع قائمة تهيئة
  Book() : title = 'Unknown', pages = 0;

  // مُنشئ مسمى
  Book.withDetails(this.title, this.pages);
}

Book book1 = Book();                      // يستخدم الافتراضي
Book book2 = Book.withDetails('Dart', 300); // يستخدم المُنشئ المسمى

يستخدم المُنشئ الافتراضي الصريح قائمة تهيئة (بعد النقطتين الرأسيتين) لتعيين القيم الأولية.

جرّب بنفسك

import 'product.dart';

void main() {
  // TODO: إنشاء منتج باستخدام المنشئ الافتراضي (default constructor)
  
  // TODO: إنشاء منتج باستخدام المنشئ المسمى (named constructor) مع 'Laptop' و 999.99
  
  // TODO: استدعاء display() لكل منتج
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming