في لغة البرمجة Dart، لا يُسمح عادةً بإنشاء عدة مُنشئين (Constructors) بنفس الاسم، ولكن هناك طريقة لتحقيق ذلك باستخدام ما يُعرف بـ “Named Constructors” أو المُنشئين ذوي الأسماء المُسماة. سنتعرف في هذه المقالة على مفهوم الـ Named Constructor وكيفية استخدامه في برمجة Dart.
مثال 1: الـ Named Constructor في لغة Dart
في هذا المثال، لدينا كلاس يُسمى “Student” يحتوي على ثلاثة خصائص: الاسم، العمر، ورقم اللفة. يحتوي الكلاس على منشئين اثنين. المنشئ الأول هو المنشئ الافتراضي (Default Constructor)، والمنشئ الثاني هو المنشئ المُسمى (Named Constructor). المُنشئ المُسمى يُستخدم لتهيئة قيم الخصائص الثلاث. لدينا أيضًا كائن من الكلاس “Student” يُسمى “student”.
class Student { String? name; int? age; int? rollNumber; // Default Constructor Student() { print("This is a default constructor"); } // Named Constructor Student.namedConstructor(String name, int age, int rollNumber) { this.name = name; this.age = age; this.rollNumber = rollNumber; } } void main() { // Here student is an object of the Student class. Student student = Student.namedConstructor("John", 20, 1); print("Name: ${student.name}"); print("Age: ${student.age}"); print("Roll Number: ${student.rollNumber}"); }
نتيجة الكود:
Name: John Age: 20 Roll Number: 1
في هذا المثال، تم إنشاء كائن من الكلاس “Student” باستخدام المُنشئ المُسمى “namedConstructor”. تم تمرير قيم “John”، 20، و 1 كمعاملات للمُنشئ المُسمى، وتم تهيئة خصائص الاسم، العمر، ورقم اللفة في الكائن المُنشأ. ثُم يتم طباعة قيم الخصائص باستخدام العبارات print()
.
مثال 2: الـ Named Constructor في لغة Dart
في هذا المثال، لدينا كلاس يُسمى “Mobile” يحتوي على ثلاثة خصائص: الاسم، اللون، والسعر. يحتوي كلاس على دالة تُسمى “displayMobileDetails” التي تقوم بطباعة قيم الخصائص الثلاثة. لدينا أيضًا كائن من الكلاس “Mobile” يُسمى “mobile”. يحتوي الكلاس أيضًا على المنشئ “Mobile” الذي يأخذ الخصائص الثلاثة كمعاملات. ولكن هناك أيضًا المنشئ المُسمى “Mobile.namedConstructor” الذي يُستخدم لإنشاء كائن من الكلاس “Mobile” باستخدام الاسم واللون والسعر الاختياري. قيمة السعر الافتراضية هي 0، وإذا لم يتم تمرير السعر، ستُستخدم القيمة الافتراضية.
class Mobile { String? name; String? color; int? prize; Mobile(this.name, this.color, this.prize); // here Mobile() is a named constructor Mobile.namedConstructor(this.name, this.color, [this.prize = 0]); void displayMobileDetails() { print("Mobile name: $name."); print("Mobile color: $color."); print("Mobile prize: $prize"); } } void main() { var mobile1 = Mobile("Samsung", "Black", 20000); mobile1.displayMobileDetails(); var mobile2 = Mobile.namedConstructor("Apple", "White"); mobile2.displayMobileDetails(); }
نتيجة الكود:
Mobile name: Samsung. Mobile color: Black. Mobile prize: 20000 Mobile name: Apple. Mobile color: White. Mobile prize: 0
في هذا المثال، تم إنشاء كائنين من كلاس “Mobile”. الكائن الأول (“mobile1”) تم إنشاؤه باستخدام المنشئ الافتراضي وتم تمرير القيم “Samsung”، “Black”، و 20000. تم طباعة قيم الخصائص باستخدام الطريقة “displayMobileDetails()”. الكائن الثاني (“mobile2”) تم إنشاؤه باستخدام المنشئ المُسمى “namedConstructor” وتم تمرير القيم “Apple” و “White”. هنا لم يتم تمرير قيمة السعر، لذا استخدمت القيمة الافتراضية 0.
مثال 3: الـ Named Constructor في لغة Dart
في هذا المثال، لدينا كلاس يُسمى “Animal” يحتوي على خاصيتين: الاسم والعمر. الكلاس يحتوي على ثلاثة منشئين. المنشئ الأول هو المنشئ الافتراضي، والمنشئ الثاني والثالث هما المنشئين المُسمين. المنشئ الثاني يُستخدم لتهيئة قيم الاسم والعمر، والمنشئ الثالث يُستخدم لتهيئة قيمة الاسم فقط. لدينا أيضًا كائن من الكلاس “Animal” يُسمى “animal”.
class Animal { String? name; int? age; // Default Constructor Animal() { print("This is a default constructor"); } // Named Constructor Animal.namedConstructor(String name, int age) { this.name = name; this.age = age; } // Named Constructor Animal.namedConstructor2(String name) { this.name = name; } } void main(){ // Here animal is an object of the Animal class. Animal animal = Animal.namedConstructor("Dog", 5); print("Name: ${animal.name}"); print("Age: ${animal.age}"); Animal animal2 = Animal.namedConstructor2("Cat"); print("Name: ${animal2.name}"); }
نتيجة الكود:
Name: Dog Age: 5 Name: Cat
في هذا المثال، تم إنشاء كائن من الكلاس “Animal” باستخدام المُنشئ المُسمى “namedConstructor” وتم تمرير القيم “Dog” و 5 للأسم والعمر على التوالي. ثم تم طباعة قيم الخصائص باستخدام العبارات print()
. تم إنشاء كائن آخر من الكلاس “Animal” باستخدام المُنشئ المُسمى “namedConstructor2” وتم تمرير القيمة “Cat” للأسم فقط.
مثال 4: الـ Named Constructor في لغة Dart
في الحياة الواقعية، يمكن استخدام المُنشئين المُسمين لتحقيق سيناريوهات مُختلفة في برمجة Dart. على سبيل المثال، دعونا نفترض أن لدينا كلاس يُسمى “Rectangle” يُمثل مستطيلًا. يحتوي الكلاس على خاصيتي الطول والعرض، ويحتوي أيضًا على منشئين مُسمين لإنشاء مستطيل بأبعاد مُختلفة.
class Rectangle { int? length; int? width; Rectangle(this.length, this.width); Rectangle.square(int side) { length = side; width = side; } void displayDimensions() { print("Length: $length"); print("Width: $width"); } } void main() { Rectangle rectangle = Rectangle(5, 10); rectangle.displayDimensions(); Rectangle square = Rectangle.square(7); square.displayDimensions(); }
نتيجة الكود:
Length: 5 Width: 10 Length: 7 Width: 7
في هذا المثال، تم إنشاء كائنين من كلاس “Rectangle”. الكائن الأول (“rectangle”) تم إنشاؤه باستخدام المنشئ الذي يأخذ الطول والعرض كمعاملات، وتم تمرير القيم 5 و 10. تم طباعة قيم الأبعاد باستخدام الدالة “displayDimensions()”. الكائن الثاني (“square”) تم إنشاؤه باستخدام المنشئ المُسمى “square” الذي يأخذ الجانب كمعامل، وتم تمرير القيمة 7. هنا، تم تهيئة الطول والعرض بنفس القيمة لإنشاء مستطيل مربع.
تحدي لك:
تحدٍ هنا هو استخدام المُنشئ المُسمى لإنشاء كلاس خاص بك يحتوي على خصائص ومنشئين مُسمين بحسب احتياجاتك. جرب إنشاء كلاس جديد واستخدم المُنشئين المُسمين لتهيئة الخصائص واختبارها.
في هذه المقالة، تعرفنا على مفهوم الـ Constructor في لغة البرمجة Dart وكيفية استخدام الـ Named Constructor لإنشاء مُنشئين إضافيين بأسماء مُخصصة. تلك الميزة تسهم في تنظيم وتحسين تصميم التطبيقات وجعلها أكثر مرونة وفعالية.