ماذا سنتعلم اليوم؟
سنتعلم اليوم مبدأ الوراثة في البرمجة كائنية التوجه (OOP)، وكيف يمكننا بناء فئات جديدة (فئات فرعية) تستفيد من خصائص وسلوكيات فئات موجودة (فئات أساسية) لإعادة استخدام الكود وتعزيز قابليته للتوسع.
الخطوة 1: بناء الفئة الأساسية (Base Class)
لنبدأ بإنشاء فئة أساسية بسيطة تمثل مفهومًا عامًا، مثل Vehicle (مركبة). هذه الفئة ستحتوي على خصائص مشتركة لكل المركبات.
class Vehicle:
def __init__(self, brand, year):
self.brand = brand # اسم العلامة التجارية للمركبة
self.year = year # سنة تصنيع المركبة
def display_info(self):
# دالة لعرض المعلومات الأساسية للمركبة
return f"Brand: {self.brand}, Year: {self.year}"
# مثال على استخدام الفئة الأساسية
my_vehicle = Vehicle("Generic Motors", 2020)
# print(my_vehicle.display_info())
الخطوة 2: إنشاء فئة فرعية (Derived Class)
الآن، سنقوم بإنشاء فئة جديدة Car (سيارة) ترث من الفئة Vehicle. هذا يعني أن Car ستحصل تلقائيًا على خصائص ودوال Vehicle، ويمكننا إضافة خصائصها الفريدة.
class Vehicle:
def __init__(self, brand, year):
self.brand = brand
self.year = year
def display_info(self):
return f"Brand: {self.brand}, Year: {self.year}"
class Car(Vehicle): # Car ترث من Vehicle
def __init__(self, brand, year, doors):
super().__init__(brand, year) # استدعاء مُنشئ الفئة الأساسية (Vehicle)
self.doors = doors # خاصية فريدة للسيارة: عدد الأبواب
def honk(self):
# دالة فريدة لفئة Car
return "Beep beep!"
# مثال على استخدام الفئة الفرعية
my_car = Car("Toyota", 2022, 4)
# print(my_car.display_info()) # تستخدم دالة display_info من Vehicle
# print(my_car.honk())
الخطوة 3: إضافة خصائص فريدة وتجاوز الدوال (Method Overriding)
يمكن للفئات الفرعية إضافة دوال جديدة، وتجاوز (override) الدوال الموجودة في الفئة الأساسية لتوفير سلوك خاص بها. لنقم بإنشاء فئة Motorcycle (دراجة نارية) وتجاوز دالة display_info.
class Vehicle:
def __init__(self, brand, year):
self.brand = brand
self.year = year
def display_info(self):
return f"Brand: {self.brand}, Year: {self.year}"
class Car(Vehicle):
def __init__(self, brand, year, doors):
super().__init__(brand, year)
self.doors = doors
def honk(self):
return "Beep beep!"
class Motorcycle(Vehicle): # Motorcycle ترث من Vehicle
def __init__(self, brand, year, type_of_bike):
super().__init__(brand, year) # استدعاء مُنشئ الفئة الأساسية
self.type_of_bike = type_of_bike # خاصية فريدة للدراجة النارية
def display_info(self): # تجاوز (override) لدالة display_info من Vehicle
# إضافة معلومات خاصة بالدراجة النارية
return f"Brand: {self.brand}, Year: {self.year}, Type: {self.type_of_bike}"
def wheelie(self):
# دالة فريدة لفئة Motorcycle
return "Doing a wheelie!"
# أمثلة على استخدام الفئات
my_car = Car("Honda", 2023, 2)
my_motorcycle = Motorcycle("Yamaha", 2021, "Sport")
# print(my_car.display_info())
# print(my_car.honk())
# print(my_motorcycle.display_info()) # ستعرض معلومات الدراجة النارية الخاصة
# print(my_motorcycle.wheelie())
ملاحظة تقنية: استخدام
super()الدالة
super().__init__(...)تستخدم لاستدعاء مُنشئ الفئة الأساسية (Parent Class Constructor). هذا يضمن تهيئة الخصائص الموروثة بشكل صحيح قبل إضافة الخصائص الفريدة للفئة المشتقة. بدونها، لن يتم تهيئة خصائص الفئة الأساسية في الكائن المشتق.
الكود النهائي الكامل
هذا الكود يجمع كل الخطوات السابقة ويظهر كيفية التفاعل بين الفئات الأساسية والفرعية.
class Vehicle:
def __init__(self, brand, year):
self.brand = brand # اسم العلامة التجارية للمركبة
self.year = year # سنة تصنيع المركبة
def display_info(self):
# دالة لعرض المعلومات الأساسية للمركبة
return f"Brand: {self.brand}, Year: {self.year}"
class Car(Vehicle): # Car ترث من Vehicle
def __init__(self, brand, year, doors):
super().__init__(brand, year) # استدعاء مُنشئ الفئة الأساسية (Vehicle)
self.doors = doors # خاصية فريدة للسيارة: عدد الأبواب
def honk(self):
# دالة فريدة لفئة Car
return "Beep beep!"
class Motorcycle(Vehicle): # Motorcycle ترث من Vehicle
def __init__(self, brand, year, type_of_bike):
super().__init__(brand, year) # استدعاء مُنشئ الفئة الأساسية
self.type_of_bike = type_of_bike # خاصية فريدة للدراجة النارية
def display_info(self): # تجاوز (override) لدالة display_info من Vehicle
# إضافة معلومات خاصة بالدراجة النارية
return f"Brand: {self.brand}, Year: {self.year}, Type: {self.type_of_bike}"
def wheelie(self):
# دالة فريدة لفئة Motorcycle
return "Doing a wheelie!"
# إنشاء كائنات من الفئات المختلفة
my_vehicle = Vehicle("Generic Motors", 2020)
my_car = Car("Honda", 2023, 2)
my_motorcycle = Motorcycle("Yamaha", 2021, "Sport")
# عرض المعلومات والسلوكيات لكل كائن
print("Vehicle Info:", my_vehicle.display_info())
print("\nCar Info:", my_car.display_info())
print("Car Action:", my_car.honk())
print("\nMotorcycle Info:", my_motorcycle.display_info())
print("Motorcycle Action:", my_motorcycle.wheelie())
النتيجة المتوقعة
عند تشغيل الكود النهائي، سيتم طباعة المعلومات التالية على الشاشة، موضحًا كيف أن كل فئة تستخدم خصائصها الموروثة والفريدة، وكيف أن الدالة display_info تم تجاوزها في فئة Motorcycle:
Vehicle Info: Brand: Generic Motors, Year: 2020 Car Info: Brand: Honda, Year: 2023 Car Action: Beep beep! Motorcycle Info: Brand: Yamaha, Year: 2021, Type: Sport Motorcycle Action: Doing a wheelie!