الوراثة والتعدد الشكلي في البرمجة الكائنية
الوراثة والتعدد الشكلي هما مفهومان رئيسيان في البرمجة الكائنية (OOP) يسمحان لك بإنشاء كود أكثر مرونة وقابلية لإعادة الاستخدام.
الوراثة
تتيح لك الوراثة إنشاء فئة جديدة بناءً على فئة موجودة بالفعل. الفئة الجديدة (الفرعية أو subclass) ترث المتغيرات والدوال من الفئة الموجودة (الأصلية أو superclass). هذا يتيح لك إعادة استخدام الكود وإنشاء تسلسل هرمي للفئات.
إليك مثالاً على الوراثة:
# Parent class
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name} makes a sound.")
# Child class
class Dog(Animal):
def speak(self):
print(f"{self.name} says woof!")
# Another child class
class Cat(Animal):
def speak(self):
print(f"{self.name} says meow!")
# Using the classes
dog = Dog("Buddy")
cat = Cat("Whiskers")
dog.speak() # Output: Buddy says woof!
cat.speak() # Output: Whiskers says meow!
Animal
هي الفئة الأصلية ولديها دالة speak()
.
Dog
وCat
هما فئتان فرعيتان ترثان من Animal
.
الفئات الفرعية تعيد تعريف (تجاوز) دالة speak()
لتقديم سلوك محدد للكلاب والقطط.
التعدد الشكلي
يتيح لك التعدد الشكلي استخدام واجهة واحدة للتفاعل مع كائنات من أنواع مختلفة. في المثال أعلاه، كل من الفئتين Dog
وCat
لديها دالة speak()
، لذا يمكنك استخدامها بشكل متبادل:
animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:
animal.speak()
هذه الحلقة ستقوم باستدعاء دالة speak()
على كل كائن، بغض النظر عما إذا كان كلبًا أو قطة.
تمارين
التمرين 1
قم بإنشاء فئة أساسية تُسمى Vehicle
مع دالة تُسمى start_engine
. قم بإنشاء فئتين فرعيتين Car
وMotorcycle
ترثان من Vehicle
وتعيدان تعريف دالة start_engine
لطباعة رسائل مختلفة.
class Vehicle:
def start_engine(self):
print("Engine started.")
class Car(Vehicle):
def start_engine(self):
print("Car engine started.")
class Motorcycle(Vehicle):
def start_engine(self):
print("Motorcycle engine started.")
car = Car()
motorcycle = Motorcycle()
car.start_engine() # Output: Car engine started.
motorcycle.start_engine() # Output: Motorcycle engine started.
التمرين 2
قم بإنشاء فئة أصلية تُسمى Shape
مع دالة تُسمى area
تُرجع 0. أنشئ فئتين فرعيتين Rectangle
وCircle
. أعد تعريف دالة area
في كل فئة فرعية لحساب وإرجاع المساحة.
import math
class Shape:
def area(self):
return 0
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * (self.radius ** 2)
rectangle = Rectangle(4, 5)
circle = Circle(3)
print(f"Rectangle area: {rectangle.area()}") # Output: Rectangle area: 20
print(f"Circle area: {circle.area()}") # Output: Circle area: 28.274333882308138
التمرين 3
قم بإنشاء قائمة من الأشكال وكرر عليها لطباعة مساحاتها باستخدام التعدد الشكلي.
shapes = [Rectangle(4, 5), Circle(3)]
for shape in shapes:
print(f"Area: {shape.area()}")
عمل رائع! لقد تعلمت كيفية استخدام الوراثة لإنشاء فئات جديدة بناءً على فئات موجودة وكيفية استخدام التعدد الشكلي للتفاعل مع الكائنات عبر واجهة مشتركة.
اترك تعليقاً