قوائم التهيئة
جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 12 من 110.
تُعد قائمة التهيئة (initializer list) هي الكود الذي يظهر بعد النقطتين الرأسيتين في المنشئ، قبل جسم المنشئ. يتم تنفيذها قبل تشغيل جسم المنشئ وتُستخدم لتهيئة متغيرات النسخة.
لقد رأيت بالفعل قوائم التهيئة في الدروس السابقة:
Point.origin() : x = 0, y = 0;الجزء الذي يلي النقطتين (x = 0, y = 0) هو قائمة التهيئة. يتم الفصل بين عمليات التهيئة المتعددة بفاصلات.
تعتبر قوائم التهيئة (Initializer lists) ضرورية عند التعامل مع متغيرات final، والتي يجب تعيين قيمتها قبل تنفيذ جسم المنشئ (constructor body):
class Circle {
final double radius;
final double area;
Circle(double r)
: radius = r,
area = 3.14159 * r * r;
}
Circle c = Circle(5);
print(c.radius); // 5.0
print(c.area); // 78.53975يمكن لقائمة التهيئة (initializer list) أيضاً إجراء حسابات أو تحويلات على معاملات المنشئ (constructor parameters) قبل تعيينها. وهذا مفيد عندما تحتاج إلى اشتقاق قيم أو التحقق من صحة البيانات أثناء إنشاء الكائن.
يمكنك دمج صيغة this. المختصرة مع قائمة التهيئة (initializer list):
class Rectangle {
final double width;
final double height;
final double area;
Rectangle(this.width, this.height)
: area = width * height;
}
Rectangle rect = Rectangle(4, 5);
print(rect.area); // 20.0هنا، يتم تعيين width و height عبر الاختصار، بينما يتم حساب area في قائمة التهيئة (initializer list) باستخدام تلك القيم.
التحدي
سهللنقم ببناء حاسبة لأبعاد الصندوق تستخدم قوائم التهيئة (initializer lists) لحساب القيم المشتقة عند إنشاء الكائنات.
ستقوم بتنظيم الكود الخاص بك في ملفين:
box.dart: قم بتعريف فئةBoxتمثل صندوقاً ثلاثي الأبعاد بأبعاد وخصائص يتم حسابها تلقائياً. يجب أن تحتوي الفئة الخاصة بك على:- ثلاثة حقول من نوع
final doubleوهي:length، وwidth، وheight - حقلين محسوبين من نوع
final doubleوهما:volumeوsurfaceArea - منشئ (constructor) يأخذ
length، وwidth، وheightباستخدام اختصارthis.، ويستخدم قائمة تهيئة لحسابvolume(الطول × العرض × الارتفاع) وsurfaceArea(2 × (الطول×العرض + العرض×الارتفاع + الارتفاع×الطول)) - طريقة
display()تقوم بطباعة معلومات الصندوق
- ثلاثة حقول من نوع
main.dart: قم باستيراد فئة الصندوق الخاصة بك وإنشاء صندوقين:- صندوق بأبعاد
3.0،4.0،5.0 - صندوق بأبعاد
2.0،2.0،2.0
display()لكل صندوق بالترتيب المذكور.- صندوق بأبعاد
يجب أن تقوم الطريقة display() بالطباعة بهذا التنسيق تماماً:
Box: [length]x[width]x[height] | Volume: [volume] | Surface: [surfaceArea]المخرجات المتوقعة:
Box: 3.0x4.0x5.0 | Volume: 60.0 | Surface: 94.0
Box: 2.0x2.0x2.0 | Volume: 8.0 | Surface: 24.0ورقة مرجعية
تُعد قائمة التهيئة (initializer list) كوداً يظهر بعد النقطتين الرأسيتين في المنشئ (constructor)، وقبل جسم المنشئ. يتم تشغيلها قبل تنفيذ جسم المنشئ وتُستخدم لتهيئة متغيرات النسخة (instance variables).
الصيغة الأساسية مع تهيئات متعددة مفصولة بفاصلة:
Point.origin() : x = 0, y = 0;تعتبر قوائم التهيئة ضرورية لمتغيرات final، والتي يجب تعيين قيمتها قبل تشغيل جسم المنشئ:
class Circle {
final double radius;
final double area;
Circle(double r)
: radius = r,
area = 3.14159 * r * r;
}يمكنك دمج صيغة this. المختصرة مع قائمة تهيئة لتعيين بعض الحقول مباشرة وحساب الحقول الأخرى:
class Rectangle {
final double width;
final double height;
final double area;
Rectangle(this.width, this.height)
: area = width * height;
}يمكن لقائمة التهيئة إجراء حسابات أو تحويلات على معاملات المنشئ قبل تعيينها، وهو أمر مفيد لاشتقاق القيم أثناء إنشاء الكائن.
جرّب بنفسك
import 'box.dart';
void main() {
// TODO: قم بإنشاء صندوق بأبعاد 3.0، 4.0، 5.0
// TODO: قم بإنشاء صندوق بأبعاد 2.0، 2.0، 2.0
// TODO: استدعِ display() على كل صندوق بالترتيب
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةالمكتبات والـ Importsمقدمة في الـ OOPالـ Classes مقابل الـ Objectsالكلمة المفتاحية thisالـ Methodsمتغيرات الـ Instanceأساسيات الـ Constructorمراجعة - آلة حاسبة بسيطة4أمان الـ Null
مقدمة في أمان الـ NullNullable مقابل Non-Nullableعاملا الـ ? و !الكلمة المفتاحية Late وأمان الـ Nullالعوامل المدركة للـ Nullأمان الـ Null في الـ Classesمراجعة - نظام ملف تعريف المستخدم7الفئات المجردة والواجهات
الفئات المجردةالدوال المجردةالواجهات في Dartالواجهات الضمنيةالتنفيذ مقابل التوسيعالواجهات المتعددةمراجعة - حاسبة الأشكال10المجموعات والأنماط العامة
نظرة عامة على List و Set و Mapالمجموعات آمنة النوعالفئات العامةالدوال العامةقيود الأنماط العامةIterable و Iteratorملخص - التخزين العام13مفاهيم OOP المتقدمة
التركيب مقابل الوراثة (Composition vs Inheritance)دوال التوسعة (Extension Methods)الأصناف القابلة للاستدعاء (Callable Classes)الأصناف المختومة (Sealed Classes - Dart 3)السجلات (Records - Dart 3)الأنماط والمطابقة (Patterns & Matching - 3.0)التعدادات مع الدوال (Enums with Methods)2المنشئات في Dart
المنشئ الافتراضيالمنشئات المسماةقوائم التهيئةالمنشئات الثابتةالمنشئات المصنعيةالمنشئات الموجهةملخص - بناء الأشكال5التغليف (Encapsulation)
الأعضاء العامة مقابل الخاصةاتفاقية البادئة _الخصوصية على مستوى المكتبةتعمق في Getters و Settersإخفاء المعلوماتمراجعة - سجلات الطلاب8Mixins
مقدمة إلى Mixinsإنشاء Mixinsاستخدام Mixins متعددةالكلمة المفتاحية on في MixinsMixin مقابل الوراثة (Inheritance)Mixin مقابل الواجهة (Interface)مراجعة - نظام الحيوانات (Animal System)3خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticحقول Final و Constمتغيرات Lateالـ Static Methods والحقولدوال الـ Getters والـ Settersمراجعة - مدير الحساب البنكي6الوراثة
أساسيات الوراثةالكلمة المفتاحية superإعادة تعريف الدوال (Method Overriding)الوسم @overrideالكلمة المفتاحية final Classالدوال البانية والوراثةمراجعة - هيكلية الموظفين9تعدد الأشكال
أساسيات تعدد الأشكالتعدد الأشكال عبر الـ Interfacesالتحقق من النوع أثناء التشغيلالمعاملات is و asالكلمة المفتاحية Covariantملخص - معالج الدفع12البرمجة الكائنية غير المتزامنة (Async OOP)
Futures و async/awaitأساسيات الـ Streamsمتحكمات الـ Streamsالـ Constructors غير المتزامنةالعمليات غير المتزامنة في دوال الكلاسمراجعة - جالب البيانات (Data Fetcher)15أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع