You are currently viewing الفرق بين Overloading و Overriding في البرمجة الكائنية مع أمثلة عملية بلغة C# و Java
الفرق بين Overloading و Overriding

الفرق بين Overloading و Overriding في البرمجة الكائنية مع أمثلة عملية بلغة C# و Java

المقدمة:

في عالم البرمجة الكائنية (Object-Oriented Programming – OOP)، يعتبر Overloading و Overriding من المفاهيم الأساسية التي تمنح المطورين القدرة على كتابة برامج مرنة وقابلة للتوسع. يمكن لهذين المفهومين أن يساهما في تحسين تجربة المستخدم وتقليل الجهد البرمجي من خلال توفير طرق متعددة لتنفيذ الدوال وتحسين السلوك الموروث. في هذا المقال، سنتعرف على الفروقات الجوهرية بين Overloading و Overriding مع شرح تفصيلي وأمثلة عملية بلغتي C# و Java لتوضيح الفكرة بشكل أعمق.

الفرق بين Overloading و Overriding

1. Overloading (تعدد الأشكال في الدالة)

  • يتم تعريف عدة دوال بنفس الاسم ولكن تختلف في عدد أو نوع المعاملات.
  • يتيح هذا النهج استدعاء الدالة بطرق مختلفة بناءً على البيانات المُمررة.

2. Overriding (تجاوز الدالة)

  • يتم تعريف دالة بنفس الاسم والتوقيع في الكلاس الفرعي (Child Class) لتخصيص السلوك الموروث من الكلاس الأب (Parent Class).
  • يستخدم لتغيير الطريقة التي يتم بها تنفيذ وظيفة معينة في الكلاس الأب.

أمثلة بلغة C#

مثال على Overloading في C#:

using System;

class Calculator {
    // دالة لجمع رقمين صحيحين
    public int Add(int a, int b) {
        return a + b;
    }

    // دالة لجمع ثلاثة أرقام
    public int Add(int a, int b, int c) {
        return a + b + c;
    }

    // دالة لجمع رقمين عشريين
    public double Add(double a, double b) {
        return a + b;
    }
}

class Program {
    static void Main(string[] args) {
        Calculator calc = new Calculator();

        Console.WriteLine(calc.Add(5, 10));       // استدعاء الدالة الأولى
        Console.WriteLine(calc.Add(5, 10, 15));  // استدعاء الدالة الثانية
        Console.WriteLine(calc.Add(5.5, 10.5));  // استدعاء الدالة الثالثة
    }
}

المخرجات:

15
30
16

مثال على Overriding في C#:

using System;

// الكلاس الأب
class Animal {
    public virtual void Sound() {
        Console.WriteLine("The animal makes a sound");
    }
}

// الكلاس الفرعي
class Dog : Animal {
    public override void Sound() {
        Console.WriteLine("The dog barks");
    }
}

// كلاس فرعي آخر
class Cat : Animal {
    public override void Sound() {
        Console.WriteLine("The cat meows");
    }
}

class Program {
    static void Main(string[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.Sound();  // استدعاء الدالة من الكلاس الأب
        myDog.Sound();     // استدعاء الدالة التي تم تجاوزها في الكلاس Dog
        myCat.Sound();     // استدعاء الدالة التي تم تجاوزها في الكلاس Cat
    }
}

المخرجات:

The animal makes a sound
The dog barks
The cat meows

الفرق بين Overloading و Overriding (ملخص)

المعيارOverloadingOverriding
المكانداخل نفس الكلاسبين الكلاس الأب والكلاس الفرعي
عدد أو نوع المعاملاتمختلفنفس العدد ونوع المعاملات
وقت التنفيذوقت الترجمة (Compile Time)وقت التشغيل (Runtime)
الاستخداملتوفير طرق متعددة لاستدعاء الدواللتغيير أو تخصيص سلوك الدالة الموروثة
الكلمات المفتاحيةلا يتطلب كلمات خاصةيتطلب كلمة override أو ما يعادلها
Overriding vs Overloading

أمثلة عملية إضافية

Overloading باستخدام دالة Print:

class Printer {
    public void Print(string text) {
        Console.WriteLine("Text: " + text);
    }

    public void Print(int number) {
        Console.WriteLine("Number: " + number);
    }

    public void Print(double value) {
        Console.WriteLine("Decimal: " + value);
    }
}

class Program {
    static void Main(string[] args) {
        Printer printer = new Printer();
        printer.Print("Hello, World!");  // استدعاء الدالة الأولى
        printer.Print(123);             // استدعاء الدالة الثانية
        printer.Print(45.67);           // استدعاء الدالة الثالثة
    }
}

Overriding مع كلاس الأشكال:

using System;

class Shape {
    public virtual void Draw() {
        Console.WriteLine("Drawing a generic shape");
    }
}

class Circle : Shape {
    public override void Draw() {
        Console.WriteLine("Drawing a circle");
    }
}

class Square : Shape {
    public override void Draw() {
        Console.WriteLine("Drawing a square");
    }
}

class Program {
    static void Main(string[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Square();

        shape1.Draw();  // استدعاء الدالة التي تم تجاوزها في Circle
        shape2.Draw();  // استدعاء الدالة التي تم تجاوزها في Square
    }
}

المخرجات:

Drawing a circle
Drawing a square

الخاتمة:

من خلال Overloading و Overriding، يتم تعزيز مرونة البرامج كائنية التوجه وتمكينها من التعامل مع سيناريوهات مختلفة بطريقة احترافية. Overloading يوفر تعددية في استدعاء الدوال داخل نفس الكلاس، بينما Overriding يتيح تخصيص السلوك الموروث في الكلاسات الفرعية. باستخدام الأمثلة بلغتي C# و Java، يمكننا فهم هذه المفاهيم وتطبيقها في مشاريعنا المستقبلية.