Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تحميل العوامل (Operator Overloading)

جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 36 من 70.

يتيح لك تحميل المعاملات الزائد (Operator overloading) تحديد كيفية تصرف المعاملات مثل +، أو -، أو == مع فئاتك المخصصة. فبدلاً من استدعاء دوال مثل point1.Add(point2)، يمكنك كتابة الشكل الأكثر طبيعية point1 + point2.

لتحميل عامل تشغيل بشكل زائد (overload)، يمكنك إنشاء أسلوب ثابت (static method) خاص باستخدام الكلمة الأساسية operator:

public class Vector
{
    public int X { get; }
    public int Y { get; }
    
    public Vector(int x, int y)
    {
        X = x;
        Y = y;
    }
    
    public static Vector operator +(Vector a, Vector b)
    {
        return new Vector(a.X + b.X, a.Y + b.Y);
    }
}

الآن يمكنك إضافة المتجهات بشكل طبيعي:

Vector v1 = new Vector(3, 4);
Vector v2 = new Vector(1, 2);
Vector v3 = v1 + v2;  // X = 4, Y = 6

يجب أن يكون التابع public static، ويجب أن يكون معامل واحد على الأقل من النوع المحتوي. يمكنك إجراء تحميل زائد للمعاملات الحسابية (+، -، *، /)، ومعاملات المقارنة (==، !=، <، >)، والمعاملات الأحادية (-، !، ++).

لاحظ أن معاملات المقارنة يجب أن يتم تحميلها بشكل زائد (overloaded) في أزواج - إذا قمت بتعريف ==، يجب عليك أيضاً تعريف !=.

استخدم التحميل الزائد للمعاملات (operator overloading) عندما يجعل ذلك كودك أكثر بديهية، خاصة للأنواع الرياضية مثل المتجهات، أو الأعداد المركبة، أو العملات. وتجنبه عندما لا يكون معنى العملية واضحاً على الفور.

challenge icon

التحدي

سهل

لنقم ببناء فئة Fraction تجعل العمل مع الكسور يبدو طبيعياً من خلال تحميل المعاملات بشكل زائد (operator overloading). بدلاً من استدعاء دوال مثل fraction1.Add(fraction2)، ستتمكن من كتابة fraction1 + fraction2 البديهية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Fraction.cs: أنشئ فئة Fraction داخل مساحة الأسماء Math تمثل كسراً ببسط ومقام. يجب أن تحتوي فئة الكسر الخاصة بك على:
    • خاصيتين صحيحتين للقراءة فقط: Numerator و Denominator
    • مشد (constructor) يقبل البسط والمقام (بهذا الترتيب)
    • تحميل زائد للمعامل + يقوم بجمع كسرين باستخدام الصيغة: (a/b) + (c/d) = (a*d + c*b) / (b*d)
    • تحميل زائد للمعامل * يقوم بضرب كسرين: (a/b) * (c/d) = (a*c) / (b*d)
    • تحميل زائد للمعامل == يعيد true إذا كان الكسران متساويين (استخدم الضرب التبادلي للمقارنة: a*d == c*b)
    • تحميل زائد للمعامل != (مطلوب عند تحميل == بشكل زائد) يعيد عكس نتيجة ==
    • دالة GetDisplay() تعيد الكسر كسلسلة نصية بتنسيق "{Numerator}/{Denominator}"
  • Program.cs: في ملفك الرئيسي، أنشئ كسرين باستخدام قيم المدخلات. قم باستعراض المعاملات المحملة بشكل زائد عن طريق جمعها، ضربها، والتحقق مما إذا كانت متساوية. اطبع النتائج لإظهار عمل المعاملات الخاصة بك بشكل طبيعي.

ستتلقى أربعة مدخلات:

  • بسط الكسر الأول (عدد صحيح)
  • مقام الكسر الأول (عدد صحيح)
  • بسط الكسر الثاني (عدد صحيح)
  • مقام الكسر الثاني (عدد صحيح)

اطبع المخرجات بهذا التنسيق:

Fraction 1: {GetDisplay()}
Fraction 2: {GetDisplay()}
Sum: {GetDisplay()}
Product: {GetDisplay()}
Are equal: {True/False}

على سبيل المثال، إذا كانت المدخلات هي 1، 2، 2، و 4، يجب أن تكون المخرجات:

Fraction 1: 1/2
Fraction 2: 2/4
Sum: 8/8
Product: 2/8
Are equal: True

لاحظ كيف تم التعرف على 1/2 و 2/4 على أنهما متساويان لأن 1*4 == 2*2. يتم حساب المجموع والناتج دون تبسيط - وهذا أمر جيد لهذا التحدي. الجمال يكمن في مدى الطبيعية التي يمكنك بها الآن العمل مع الكسور باستخدام معاملات مألوفة!

جرّب بنفسك

using System;
using Math;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة المدخلات للكسر الأول
        int num1 = Convert.ToInt32(Console.ReadLine());
        int den1 = Convert.ToInt32(Console.ReadLine());
        
        // قراءة المدخلات للكسر الثاني
        int num2 = Convert.ToInt32(Console.ReadLine());
        int den2 = Convert.ToInt32(Console.ReadLine());
        
        // TODO: إنشاء كائنين من نوع Fraction باستخدام قيم المدخلات
        
        // TODO: استخدام معامل + الزائد (overloaded) لجمع الكسور
        
        // TODO: استخدام معامل * الزائد (overloaded) لضرب الكسور
        
        // TODO: استخدام معامل == الزائد (overloaded) للتحقق من التساوي
        
        // TODO: طباعة المخرجات بالتنسيق المطلوب:
        // Fraction 1: {GetDisplay()}
        // Fraction 2: {GetDisplay()}
        // Sum: {GetDisplay()}
        // Product: {GetDisplay()}
        // Are equal: {True/False}
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming