دارت هي لغة برمجة موجهة للكائنات OOP توفر ميزات مختلفة للعمل مع الكلاسات والكائنات. الـ Constructor هو أسلوب خاص يستخدم لتهيئة كائن عند إنشائه. يسمح لك بتعيين القيم الأولية لخصائص الكائن. في هذه المقالة، سنستكشف مفهوم الـ Constructor في دارت ونتعلم كيفية استخدامه بفعالية.
مفهوم الـ Constructor في دارت:
الـ Constructor في دارت هو أسلوب خاص يحمل نفس اسم الكلاس ويستخدم لتهيئة الكائن. يتم استدعاؤه تلقائيًا عند إنشاء object. يمكن استخدام الـ Constructor لتعيين القيم الأولية لخصائص الكائن object.
طريقة كتابة الـ Constructor في دارت:
صيغة الـ Constructor في دارت كما يلي:
class ClassName { ClassName() { // جسم الـ Constructor } }
يحتوي جسم الـ Constructor على الأكواد التي تقوم بتهيئة خصائص الكائن object أو تنفيذ أي مهام ضرورية أخرى.
كيفية إنشاء الـ Constructor في دارت
لنبدأ بمثال بسيط لتوضيح الـ Constructor في دارت. لنفترض وجود كلاس يسمى “Person” يحتوي على خاصيتين: “name” و “age”. سنقوم بتعريف الـ Constructor للكلاس “Person” لتعيين القيم الأولية لهذه الخصائص.
class Person { String? name; int? age; Person(String name, int age) { this.name = name; this.age = age; } }
في الأكواد أعلاه، قمنا بتعريف الـ Constructor للكلاس “Person” الذي يأخذ معاملين: “name” و “age”. داخل الـ Constructor، نسند قيم المعاملات إلى الخصائص المقابلة باستخدام الكلمة الأساسية “this”.
الآن، دعنا ننشئ كائنًا object من الكلاس “Person” ونقوم بتهيئته باستخدام الـ Constructor:
void main() { Person person = Person("John", 30); print("Name: ${person.name}"); print("Age: ${person.age}"); }
نتيجة الكود:
Name: John Age: 30
في الأكواد أعلاه، قمنا بإنشاء كائن “person” من الكلاس “Person” ونقل قيم “John” و 30 إلى الـ Constructor. يقوم الـ Constructor بتعيين القيم الأولية لخصائص “name” و “age”. أخيراً ، قمنا بطباعة قيم هذه الخصائص في النهاية.
الـ Constructor مع معاملات اختيارية
تتيح لك دارت تعريف الـ Constructor بمعاملات اختيارية. يمكن تجاهل المعاملات الاختيارية عند إنشاء الكائن، ويتم تعيين قيم افتراضية لها.
class Rectangle { double width; double height; Rectangle([this.width = 0, this.height = 0]); }
في الأكواد أعلاه، قمنا بتعريف كلاس “Rectangle” مع معاملين اختياريين: “width” و “height”. الأقواس المربعة “[]” حول المعاملات تشير إلى أنها اختيارية. كما قمنا بتعيين قيم افتراضية قدرها 0 لكلا المعاملين.
الآن، دعنا ننشئ كائنات من الكلاس “Rectangle” مع تحديد المعاملات الاختيارية وبدون تحديدها:
void main() { Rectangle rectangle1 = Rectangle(); Rectangle rectangle2 = Rectangle(5, 10); print("Rectangle 1: ${rectangle1.width} x ${rectangle1.height}"); print("Rectangle 2: ${rectangle2.width} x ${rectangle2.height}"); }
نتيجة الكود:
Rectangle 1: 0.0 x 0.0 Rectangle 2: 5.0 x 10.0
في الأكواد أعلاه، قمنا بإنشاء كائنين “rectangle1” و “rectangle2” من الكلاس “Rectangle”. في “rectangle1″، لم نقدم أي قيم للمعاملات الاختيارية، لذا تأخذ قيمها الافتراضية. في “rectangle2″، قدمنا قيمًا بشكل صريح للمعاملات الاختيارية.
الـ Constructor مع معاملات بأسماء
تدعم دارت أيضًا الـ Constructor بمعاملات بأسماء. تسمح لك المعاملات بأسماء بتحديد قيم المعاملات باستخدام أسمائها، مما يوفر مرونة ووضوحًا أكبر.
class Circle { double radius; String color; Circle({this.radius = 0, this.color = "red"}); }
في الأكواد أعلاه، قمنا بتعريف الكلاس “Circle” مع معاملين بأسماء: “radius” و “color”. الأقواس المنحنية “{}” حول المعاملات تشير إلى أنها معاملات بأسماء. كما قمنا بتعيين قيم افتراضية قدرها 0 لـ “radius” و “red” لـ “color”.
الآن، دعنا ننشئ كائنات من الكلاس “Circle” ونحدد قيم المعاملات باستخدام أسمائها:
void main() { Circle circle1 = Circle(radius: 5); Circle circle2 = Circle(color: "blue", radius: 3); print("Circle 1: Radius=${circle1.radius}, Color=${circle1.color}"); print("Circle 2: Radius=${circle2.radius}, Color=${circle2.color}"); }
نتيجة الكود:
Circle 1: Radius=5.0, Color=red Circle 2: Radius=3.0, Color=blue
في الأكواد أعلاه، قمنا بإنشاء كائنين “circle1” و “circle2” من الكلاس “Circle”. في “circle1″، قدمنا قيمة للمعامل “radius” فقط باستخدام اسمه. لذلك، تأخذ المعاملات الأخرى قيمها الافتراضية. في “circle2″، قدمنا قيمًا لكل من المعاملات “color” و “radius” باستخدام أسمائها.
استخدام الـ Constructor في دارت يساعد في تهيئة الكائنات وتعيين القيم الأولية لخصائصها. إنها طريقة قوية لتنظيم وتبسيط الأكواد وتعزيز قابلية إعادة الاستخدام. يمكنك تعريف الـ Constructor بمعاملات اختيارية أو بأسماء، حسب متطلباتك.