تحميل العوامل (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 عندما يجعل كودك أكثر سهولة في الفهم، وخصوصًا مع الأنواع الرياضية مثل المتجهات أو الأعداد المركبة أو الأموال. تجنّبه عندما لا يكون معنى العملية واضحًا فورًا.
التحدي
سهللنَبْنِ فئة Fraction تجعل التعامل مع الكسور طبيعيًا من خلال التحميل الزائد للمعاملات. بدلًا من استدعاء method مثل fraction1.Add(fraction2)، ستتمكن من كتابة fraction1 + fraction2 البديهية.
ستنظّم شيفرتك عبر ملفين:
Fraction.cs: أنشئ فئةFractionفيMathnamespace تمثّل كسرًا ببسط ومقام. يجب أن يحتوي الكسر على:- خاصيتين صحيحتين للقراءة فقط:
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}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injectionتدرّب بنفسك: مترجم C# عبر الإنترنت