في هذا المقال، سنقدم 10 تمارين محلولة باستخدام لغة دارت Dart OOP. تعتبر لغة دارت (Dart) واحدة من اللغات البرمجية القوية والمتنامية التي تستخدم في تطوير تطبيقات الويب والتطبيقات المحمولة، وتتميز بدعمها القوي لبرمجة الكائنات (OOP)، مما يجعلها خيارًا شائعًا بين المطورين. وفي هذا الجزء الرابع من سلسلة تمارين البرمجة بلغة دارت، سنقدم عشر تمارين محلولة تركز على المفاهيم الأساسية لبرمجة الكائنات Dart OOP، لمساعدتك في فهم وتعلم هذه اللغة بشكل أفضل.
تمرين 1: إنشاء كلاس بسيط
قم بكتابة برنامج بلغة دارت لإنشاء كلاس بسيط يُمثِّل شخصًا يحتوي على خاصية لاسم الشخص ودالة لطباعة اسم الشخص.
الحل:
class Person { String name; Person(this.name); void printName() { print("اسم الشخص: $name"); } } void main() { Person person = Person("أحمد"); person.printName(); }
النتيجة:
اسم الشخص: أحمد
“اقرأ أيضاً: تمارين محلولة على لغة دارت الجزء الثالث“
تمرين 2: الوراثة (Inheritance)
قم بكتابة برنامج بلغة دارت لإنشاء كلاس رئيسي يسمى (Animal)، وكلاس مشتق يسمى (Dog) يرث الخصائص والدوال من الكلاس الرئيسي. الكلاس الرئيسي يحتوي على خاصية اسم الحيوان ودالة لطباعة اسم الحيوان، والكلاس الفرعي يستدعي البناء الأساسي للكلاس الرئيسي ويضيف خاصية إضافية لعرض عدد الأرجل للكلب.
الحل:
class Animal { String name; Animal(this.name); void printName() { print("اسم الحيوان: $name"); } } class Dog extends Animal { int numberOfLegs; Dog(String name, this.numberOfLegs) : super(name); void printNumberOfLegs() { print("عدد أرجل الكلب: $numberOfLegs"); } } void main() { Dog dog = Dog("بوبي", 4); dog.printName(); dog.printNumberOfLegs(); }
النتيجة:
اسم الحيوان: بوبي عدد أرجل الكلب: 4
“اقرأ أيضاً: شرح مفهوم الوراثة في لغة دارت“
تمرين 3: الواجهات (Interfaces)
قم بكتابة برنامج بلغة دارت لإنشاء واجهة Shape تمثل شكلًا هندسيًا، مثل مثلث أو مستطيل، وقم بإنشاء كلاس يُمثِّل شكلًا هندسيًا معينًا يُنفِّذ الواجهة ويحتوي على دالة لحساب مساحة الشكل.
الحل:
abstract class Shape { double calculateArea(); } class Rectangle implements Shape { double width; double height; Rectangle(this.width, this.height); double calculateArea() { return width * height; } } void main() { Rectangle rectangle = Rectangle(4, 6); double area = rectangle.calculateArea(); print("مساحة المستطيل: $area"); }
النتيجة:
مساحة المستطيل: 24
“اقرأ أيضاً: شرح الـ Interface في لغة دارت“
تمرين 4: مفهوم الـ Enum
قم بكتابة برنامج بلغة دارت لإنشاء الـ Enum ويكون باسم “Days” الذي يحتوي على أيام الأسبوع. ثم استخدم حلقة for
للتكرار على جميع القيم الموجودة في الـ Enum وطباعتها.
الحل:
enum Days { sunday, monday, tuesday, wednesday, thursday, friday, saturday } void main() { for (Days day in Days.values) { print(day); } }
النتيجة:
Days.sunday Days.monday Days.tuesday Days.wednesday Days.thursday Days.friday Days.saturday
“اقرأ أيضاً: شرح مفهوم الـ Enum في لغة دارت“
تمرين 5: الاستثناءات (Exceptions)
قم بكتابة برنامج بلغة دارت لإنشاء دالة تقوم بإلقاء استثناء إذا تم تمرير قيمة غير صالحة إليها، ثم قم بمحاولة استدعاء هذه الدالة بتمرير قيمة غير صالحة لاصطياد الاستثناء وطباعة رسالة خطأ.
تلميح: قم بالإجابة على هذا السؤال باستخدام عبارات try & catch في لغة دارت (Dart)
الحل:
double divideNumbers(double a, double b) { if (b == 0) { throw Exception("لا يمكن قسمة عدد على الصفر."); } return a / b; } void main() { try { double result = divideNumbers(10, 0); print("ناتج القسمة: $result"); } catch (e) { print("حدث خطأ: $e"); } }
النتيجة:
حدث خطأ: Exception: لا يمكن قسمة عدد على الصفر.
تمرين 6: الخصائص (Getters و Setters)
قم بكتابة برنامج بلغة دارت لإنشاء كلاس يسمى Student يحتوي على ثلاث خصائص Private هي _firstName و _lastName و _age. يوجد اثنان من الـ Getters وهما fullName و age للحصول على قيمة الخصائص. يوجد أيضًا ثلاثة Setters وهما firstName و lastName و age لتحديث قيمة الخصائص. إذا كانت قيمة العمر أقل من 0، فسيتم ظهور خطأ.
الحل:
class Student { String? _firstName; String? _lastName; int? _age; String get fullName => "${_firstName!} ${_lastName!}"; int get age => _age!; set firstName(String firstName) => _firstName = firstName; set lastName(String lastName) => _lastName = lastName; set age(int age) { if (age < 0) { throw Exception("لا يمكن أن يكون العمر أقل من 0"); } _age = age; } } void main() { Student st = Student(); st.firstName = "John"; st.lastName = "Doe"; st.age = 20; print("الاسم الكامل: ${st.fullName}"); print("العمر: ${st.age}"); }
النتيجة:
الاسم الكامل: John Doe العمر: 20
“اقرأ أيضاً: شرح مفهوم الـ Getter و Setter في لغة دارت“
تمرين 7: الدوال الثابتة (Static Methods)
قم بكتابة برنامج بلغة دارت لإنشاء كلاس يُمثِّل مثلثًا، وقم بتعريف دالة ثابتة (static) لحساب مساحة المثلث باستخدام طول قاعدته وارتفاعه. قم بتجربة الدالة الثابتة.
الحل:
class Triangle { double base; double height; Triangle(this.base, this.height); static double calculateArea(double base, double height) { return 0.5 * base * height; } } void main() { double area = Triangle.calculateArea(4, 6); print("مساحة المثلث: $area"); }
النتيجة:
مساحة المثلث: 12.0
“اقرأ أيضاً: شرح مفهوم الـ Static في لغة دارت“
تمرين 8: الوراثة متعددة المستويات (Multilevel Inheritance)
لدينا كلاس رئيسي يسمى (Animal)، وكلاس مشتق يسمى (Dog) يرث الخصائص والدوال من الكلاس الرئيسي، وكلاس مشتق آخر يسمى (Puppy) يرث الخصائص والسلوك من كلاس Dog. قم بإنشاء كلاس Animal بخاصية اسم الحيوان ودالة لطباعة اسم الحيوان، ثم قم بإنشاء كلاس Animal وكلاس Puppy واختبار الوراثة المتعددة.
الحل:
class Animal { String name; Animal(this.name); void printName() { print("اسم الحيوان: $name"); } } class Dog extends Animal { Dog(String name) : super(name); } class Puppy extends Dog { Puppy(String name) : super(name); } void main() { Puppy puppy = Puppy("بوبي جراء"); puppy.printName(); }
النتيجة:
اسم الحيوان: بوبي جراء
“اقرأ أيضاً: شرح الـ Constructor في لغة دارت“
تمرين 9: الإستاتيك (Static)
قم بكتابة برنامج بلغة دارت لإنشاء كلاس يحتوي على خاصية استاتيكية (static) ودالة استاتيكية (static)، ثم استخدم الخاصية والدالة في الكود الرئيسي.
الحل:
class MathUtils { static const double pi = 3.14; static double calculateCircleArea(double radius) { return pi * radius * radius; } } void main() { double radius = 5; double area = MathUtils.calculateCircleArea(radius); print("مساحة الدائرة: $area"); print("قيمة ثابت الباي: ${MathUtils.pi}"); }
النتيجة:
مساحة الدائرة: 78.5 قيمة ثابت الباي: 3.14
“اقرأ أيضاً: شرح مفهوم الـ Default Constructor في لغة دارت“
تمرين 10: الوراثة والاستدعاء الثابت (Inheritance and Static Invocation):
قم بكتابة برنامج بلغة دارت لإنشاء كلاس رئيسي يسمى (Person) يحتوي على خاصية استاتيكية تُعدِّد أنواع الجنس، وكلاس مشتق يسمى (Employee) يرث الخصائص والدوال من الكلاس الرئيسي ويضيف خاصية استاتيكية تُعدِّد أقسام العمل. قم بإنشاء الكلاسين واستدعاء الخصائص الاستاتيكية.
الحل:
class Person { static const List<String> genders = ['ذكر', 'أنثى']; } class Employee extends Person { static const List<String> departments = ['مبيعات', 'تسويق', 'تطوير']; static void printGendersAndDepartments() { print("أنواع الجنس: ${Person.genders}"); print("أقسام العمل: $departments"); } } void main() { Employee.printGendersAndDepartments(); }
النتيجة:
أنواع الجنس: [ذكر, أنثى] أقسام العمل: [مبيعات, تسويق, تطوير]
“اقرأ أيضاً: 10 تمارين محلولة على Null Safety في لغة دارت Dart“
تمثل تمارين البرمجة دائمًا وسيلة فعّالة لتعلم وتطبيق المفاهيم البرمجية بشكل عملي، وفي هذا الجزء الرابع من سلسلة تمارين لغة دارت، قدمنا عشر تمارين محلولة تركز على بناء المفاهيم الأساسية لبرمجة الكائنات OOP. نأمل أن تكون هذه التمارين مفيدة لك في تطوير مهاراتك في لغة دارت وفهمها بشكل أفضل، ونشجعك على مواصلة التعلم واستكشاف المزيد من المفاهيم والممارسات البرمجية في هذا السياق المثير والمتطور.