الوراثة والتعدد الشكلي في البرمجة الكائنية

Amine
15/09/2024

الوراثة والتعدد الشكلي هما مفهومان رئيسيان في البرمجة الكائنية (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()}")

عمل رائع! لقد تعلمت كيفية استخدام الوراثة لإنشاء فئات جديدة بناءً على فئات موجودة وكيفية استخدام التعدد الشكلي للتفاعل مع الكائنات عبر واجهة مشتركة.

التعليقات

اترك تعليقاً