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

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

جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 36 من 70.

تتيح لك إعادة تحميل operator تحديد كيفية تصرّف operators مثل + أو - أو == مع class المخصّصة بك. وبدلًا من استدعاء method مثل point1.Add(point2)، يمكنك كتابة الصيغة الأكثر طبيعية point1 + point2.

لإجراء Overload لـ operator، تنشئ 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 تجعل التعامل مع الكسور طبيعيًا من خلال التحميل الزائد للمعاملات. بدلًا من استدعاء method مثل fraction1.Add(fraction2)، ستتمكن من كتابة fraction1 + fraction2 البديهية.

ستنظّم شيفرتك عبر ملفين:

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

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

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

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

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: استخدم العامل المُحمَّل + لجمع الكسور
        
        // TODO: استخدم العامل المُحمَّل * لضرب الكسور
        
        // TODO: استخدم العامل المُحمَّل == للتحقق من التساوي
        
        // TODO: اطبع المخرجات بالتنسيق المطلوب:
        // الكسر 1: {GetDisplay()}
        // الكسر 2: {GetDisplay()}
        // المجموع: {GetDisplay()}
        // حاصل الضرب: {GetDisplay()}
        // Are equal: {True/False}
    }
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C# عبر الإنترنت