أعضاء الـ Instance مقابل الـ Static
جزء من قسم البرمجة كائنية التوجه في رحلة Dart على Coddy. الدرس 17 من 110.
في فئات Dart، يمكن أن تنتمي الأعضاء (المتغيرات وmethod) إلى كائنات فردية أو إلى الفئة نفسها. يُعد فهم هذا التمييز أمرًا أساسيًا لتنظيم شفرتك بفعالية.
Instance members تنتمي إلى كل كائن تنشئه. يحصل كل كائن على نسخته الخاصة من متغيرات Instance، وتعمل أساليب Instance على بيانات ذلك الكائن المحدد:
class Dog {
String name; // متغير المثيل
Dog(this.name);
void bark() { // دالة المثيل
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy يقول woof!
dog2.bark(); // Max يقول woof!لكل كائن Dog خاصية name خاصة به. تغيير اسم أحد الكلبين لا يؤثر في الآخر.
الأعضاء static تنتمي إلى class نفسها، وليس إلى أي كائن معيّن. وهي مشتركة بين جميع النسخ، ويتم الوصول إليها باستخدام اسم class:
class Dog {
String name;
static int totalDogs = 0; // متغير ثابت
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2المتغير totalDogs مشترك — توجد نسخة واحدة فقط بغض النظر عن عدد كائنات Dog الموجودة. يمكنك الوصول إليه من خلال اسم الفئة Dog.totalDogs، وليس من خلال مثيل.
التحدي
سهللنُنشئ نظامًا لعدّ الزوار لمتحف يتتبّع زيارات كل معروض على حدة وإحصاءات المتحف العامة.
ستنظّم التعليمات البرمجية في ملفين:
exhibit.dart: عرّف فئةExhibitتمثّل معروضًا في المتحف. يجب أن يحتوي كل معروض على:- متغير مثيل
nameمن النوع (String) لاسم المعروض - متغير مثيل
visitorCountمن النوع (int) يبدأ عند0لتتبّع عدد الأشخاص الذين زاروا هذا المعروض المحدد - متغير static باسم
totalVisitorsمن النوع (int) يبدأ عند0لتتبّع إجمالي الزيارات عبر جميع المعروضات - منشئ يأخذ اسم المعروض
- طريقة
recordVisit()تزيد كلًا منvisitorCountالخاص بالمعروض وtotalVisitorsالخاص بالفئة - طريقة
displayStats()تطبع معلومات المعروض
- متغير مثيل
main.dart: استورد فئة المعروض وأنشئ معروضين:- معروض
'Dinosaur Bones' - معروض
'Ancient Egypt'
displayStats()لكل معروض بالترتيب الذي أُنشئا به، ثم اطبع إجمالي الزوار عبر جميع المعروضات.- معروض
يجب أن تطبع طريقة displayStats() بالتنسيق الدقيق التالي:
[name]: [visitorCount] visitorsبالنسبة إلى سطر إجمالي الزوار، اطبع:
Total museum visitors: [totalVisitors]يمكنك الوصول إلى المتغير static باستخدام اسم الفئة Exhibit.totalVisitors.
الناتج المتوقع:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5جرّب بنفسك
import 'exhibit.dart';
void main() {
// TODO: Create a 'Dinosaur Bones' exhibit
// TODO: Create an 'Ancient Egypt' exhibit
// TODO: Record 3 visits to the Dinosaur Bones exhibit
// TODO: Record 2 visits to the Ancient Egypt exhibit
// TODO: استدعِ displayStats() على كل معرض بالترتيب
// TODO: Print total museum visitors using Exhibit.totalVisitors
// Format: Total museum visitors: [totalVisitors]
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودعتدرّب بنفسك: مترجم Dart عبر الإنترنت