🔹 البرمجة الكائنية (OOP) في Dart 🚀
🔹 البرمجة الكائنية التوجه (Object-Oriented Programming - OOP
) هي نمط برمجي يعتمد على الكائنات (Objects
)، التي تتكون من الخصائص (Properties
) و الوظائف (Methods
).
في Dart، يتم تنفيذ الـ OOP باستخدام الكلاسات (Classes
) والأشياء (Objects
).
🔹 1. تعريف Class
(الكلاس)
🔹 Class
هو قالب (Blueprint
) لإنشاء الكائنات.
🔹 يحتوي على خصائص (Variables
) و وظائف (Methods
).
🔹 يتم إنشاء كائن (Object
) من Class
لاستخدامه.
📌 مثال: إنشاء Class
باسم Person
dartنسختحرير<code>class Person {
String name = "غير معروف"; // خاصية (Property)
int age = 0;
// دالة (Method)
void introduce() {
print("مرحبًا، أنا $name وعمري $age سنة.");
}
}
</code>
Dart🔹 التفسير:
name
وage
هما خصائص (Properties
).introduce()
هي وظيفة (Method
) تقوم بطباعة معلومات الشخص.
🔹 2. إنشاء Object
(كائن)
بعد تعريف الكلاس، يمكننا إنشاء كائن (Object
) واستخدامه.
📌 مثال: إنشاء كائن من Person
dartنسختحرير<code>void main() {
Person person1 = Person(); // 🆕 إنشاء كائن
person1.name = "أحمد";
person1.age = 25;
person1.introduce(); // استدعاء الدالة
}
</code>
Dart✅ الناتج:
نسختحريرمرحبًا، أنا أحمد وعمري 25 سنة.
🔹 التفسير:
Person person1 = Person();
يُنشئ كائنًا جديدًا منPerson
.person1.name = "أحمد";
يقوم بتحديث الاسم.person1.introduce();
يستدعي الوظيفة (Method
).
🔹 3. المُنشئ (Constructor
)
🔹 Constructor
هو دالة خاصة تُستدعى عند إنشاء الكائن.
🔹 يمكننا استخدامه لتعيين القيم مباشرة عند الإنشاء.
📌 مثال: استخدام Constructor
لتحديد الخصائص عند الإنشاء
dartنسختحرير<code>class Person {
String name;
int age;
// المُنشئ (Constructor)
Person(this.name, this.age);
void introduce() {
print("مرحبًا، أنا $name وعمري $age سنة.");
}
}
void main() {
Person person1 = Person("خالد", 30); // 👈 تمرير القيم مباشرة
person1.introduce();
}
</code>
Dart✅ الناتج:
نسختحريرمرحبًا، أنا خالد وعمري 30 سنة.
🔹 التفسير:
Person(this.name, this.age);
يقوم بتحديد القيم عند إنشاء الكائن.- لم نعد بحاجة إلى تعيين القيم يدويًا بعد الإنشاء.
🔹 4. المُنشئات المسماة (Named Constructors
)
🔹 يمكننا إنشاء أكثر من منشئ (Constructor
) باستخدام Named Constructors
.
📌 مثال: إنشاء منشئات متعددة
dartنسختحرير<code>class Car {
String brand;
int year;
// منشئ عادي
Car(this.brand, this.year);
// منشئ باسم (لإنشاء سيارة بدون سنة محددة)
Car.onlyBrand(String brand) : this(brand, 2024);
void info() {
print("السيارة من نوع $brand، موديل $year.");
}
}
void main() {
Car car1 = Car("Toyota", 2020);
car1.info();
Car car2 = Car.onlyBrand("BMW");
car2.info();
}
</code>
Dart✅ الناتج:
yamlنسختحريرالسيارة من نوع Toyota، موديل 2020.
السيارة من نوع BMW، موديل 2024.
🔹 التفسير:
Car.onlyBrand()
هو منشئ مسمى (Named Constructor
) يسمح بإنشاء سيارة بدون تحديدyear
.this(brand, 2024);
يستدعي المنشئ الأساسي مع تعيينyear
إلى 2024 تلقائيًا.
🔹 5. الوراثة (Inheritance
)
🔹 تسمح Inheritance
بإعادة استخدام كود الكلاسات عن طريق وراثة الخصائص والوظائف.
📌 مثال: Car
ترث Vehicle
dartنسختحرير<code>class Vehicle {
String brand;
Vehicle(this.brand);
void start() {
print("$brand بدأت العمل!");
}
}
// `Car` ترث `Vehicle`
class Car extends Vehicle {
int year;
Car(String brand, this.year) : super(brand);
void info() {
print("🚗 سيارة $brand موديل $year.");
}
}
void main() {
Car car1 = Car("Ford", 2023);
car1.start(); // من الكلاس الأب
car1.info(); // من الكلاس الابن
}
</code>
Dart✅ الناتج:
yamlنسختحريرFord بدأت العمل!
🚗 سيارة Ford موديل 2023.
🔹 التفسير:
extends Vehicle
تعني أنCar
ترث جميع خصائص ودوالVehicle
.super(brand);
يستدعي المُنشئ (Constructor
) للكلاس الأب.
🔹 6. التجريد (Abstract Classes
)
🔹 abstract class
لا يمكن إنشاء كائنات منها مباشرة، بل تُستخدم كقالب (Blueprint
) لكلاسات أخرى.
📌 مثال: abstract class
dartنسختحرير<code>abstract class Animal {
void makeSound(); // دالة بدون تنفيذ
}
// وراثة الكلاس المجرد
class Dog extends Animal {
@override
void makeSound() {
print("🐶 الكلب ينبح: هو هو!");
}
}
void main() {
Dog dog = Dog();
dog.makeSound();
}
</code>
Dart✅ الناتج:
نسختحرير🐶 الكلب ينبح: هو هو!
🔹 التفسير:
abstract class Animal
يحتوي على دالة بدون تنفيذ.Dog
يرثAnimal
ويجب أن ينفذmakeSound()
.
🎯 خلاصة البرمجة الكائنية (OOP) في Dart
✅ Class
→ هو قالب يحتوي على خصائص (Properties
) و وظائف (Methods
).
✅ Object
→ هو كائن يتم إنشاؤه من Class
.
✅ Constructor
→ دالة خاصة تنفذ عند إنشاء الكائن.
✅ Named Constructor
→ لإنشاء منشئات متعددة.
✅ Inheritance
→ تسمح لـ Class
بوراثة Class
آخر (extends
).
✅ Abstract Class
→ كلاس مجرد لا يمكن إنشاء كائن منه (abstract
).