تحميل عوامل الحساب الزائد
عرّفوا + و- و* لأنواعكم الخاصة
تحميل عوامل الحساب الزائد درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا نستخدم التحميل الزائد للمعاملات الحسابية؟
يتيح التحميل الزائد للمعاملات لأنواعك استخدام رموز مألوفة مثل + و- و*. وبالنسبة إلى الأنواع الشبيهة بالقيم، مثل المتجهات والقيم المالية والأعداد المركبة، يجعل ذلك الكود مقروءًا كأنه رياضيات بدلًا من استدعاءات الأساليب.
صياغة operator +
يُعلَن عن المعامل المحمّل تحميلًا زائدًا بوصفه أسلوبًا public static، ويكون اسمه operator متبوعًا بالرمز. ويجب أن يكون أحد المعاملات على الأقل من النوع الذي يحتوي الأسلوب.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var sum = new Vector2(1, 2) + new Vector2(3, 4);
Console.WriteLine(sum);
}
}الطرح والضرب
يمكنك تحميل عدة معاملات تحميلًا زائدًا في النوع نفسه. نضيف هنا الطرح والضرب في قيمة عددية إلى متجهنا.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a, Vector2 b)
=> new Vector2(a.X - b.X, a.Y - b.Y);
public static Vector2 operator *(Vector2 a, int k)
=> new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var v = new Vector2(5, 6) - new Vector2(2, 1);
Console.WriteLine(v);
Console.WriteLine(new Vector2(2, 3) * 4);
}
}المعاملات دائمًا static
يجب أن تكون المعاملات المحمّلة تحميلًا زائدًا static. فهي لا تعمل على this مخفي، بل تُمرَّر القيم الداخلة إليها كمعاملات صريحة. ويربط المصرّف الرمز بالأسلوب.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal amount) { Amount = amount; }
public static Money operator +(Money a, Money b)
=> new Money(a.Amount + b.Amount);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var total = new Money(10.5m) + new Money(4.25m);
Console.WriteLine(total);
}
}المعاملات الأحادية
تأخذ المعاملات الأحادية، مثل النفي، قيمةً داخلة واحدة. حمّل operator - بمعامل واحد لدعم تعبيرات مثل -v.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a)
=> new Vector2(-a.X, -a.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
Console.WriteLine(-new Vector2(3, -7));
}
}قيم داخلة من أنواع مختلطة
يمكن أن تكون إحدى القيم الداخلة من نوع مختلف. ويتيح توفير الترتيبين للمستخدمين كتابة التعبير بالطريقة الطبيعية في كلتا الحالتين.
using System;
public struct Temperature
{
public double Celsius;
public Temperature(double c) { Celsius = c; }
public static Temperature operator +(Temperature t, double delta)
=> new Temperature(t.Celsius + delta);
public static Temperature operator +(double delta, Temperature t)
=> new Temperature(t.Celsius + delta);
public override string ToString() => Celsius + "C";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Temperature(20) + 5);
Console.WriteLine(5 + new Temperature(20));
}
}إرجاع قيم جديدة
ينبغي ألا تعدّل المعاملات الحسابية القيم التي تعمل عليها. بل تحسب وتعيد قيمة جديدة، مع إبقاء القيم الأصلية دون تغيير، كما يفعل int.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var a = new Vector2(1, 1);
var b = new Vector2(2, 2);
var c = a + b;
Console.WriteLine("a unchanged: " + a);
Console.WriteLine("result: " + c);
}
}تسلسل العمليات الحسابية
بما أن كل معامل يعيد النوع نفسه، تتسلسل التعبيرات بصورة طبيعية وتحترم أولوية العمليات وترابطها المعتادين.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b) => new Vector2(a.X + b.X, a.Y + b.Y);
public static Vector2 operator *(Vector2 a, int k) => new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var result = new Vector2(1, 1) + new Vector2(2, 2) * 3;
Console.WriteLine(result);
}
}المعاملات في الفئات
يعمل التحميل الزائد للمعاملات مع الفئات أيضًا، وليس مع البنى فقط. انتبه إلى null: فقد تكون القيمة الداخلة من فئة مساويةً لـ null، لذا أضف تحققًا عند الحاجة.
using System;
public class Complex
{
public double Re, Im;
public Complex(double re, double im) { Re = re; Im = im; }
public static Complex operator +(Complex a, Complex b)
=> new Complex(a.Re + b.Re, a.Im + b.Im);
public override string ToString() => Re + " + " + Im + "i";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Complex(1, 2) + new Complex(3, 4));
}
}نوع رقمي متكامل
إليك نوعًا صغيرًا للكسور مع عملية جمع. يوضح ذلك كيف يحوّل التحميل الزائد نوعًا من مجال معين إلى شيء يتصرف مثل رقم مضمّن في اللغة.
using System;
public struct Fraction
{
public int Num, Den;
public Fraction(int num, int den) { Num = num; Den = den; }
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.Num * b.Den + b.Num * a.Den, a.Den * b.Den);
public override string ToString() => Num + "/" + Den;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Fraction(1, 2) + new Fraction(1, 3));
}
}جرّب بنفسك
أضف إلى بنية شبيهة بالأموال عمليتي الجمع والضرب في قيمة عددية، ثم أنشئ تعبيرًا يبدو كالحساب المعتاد.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal a) { Amount = a; }
public static Money operator +(Money a, Money b) => new Money(a.Amount + b.Amount);
public static Money operator *(Money a, int qty) => new Money(a.Amount * qty);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var price = new Money(4.50m);
var total = price * 3 + new Money(2.00m);
Console.WriteLine(total);
}
}تحقق سريع
تذكّر توقيع المعامل المحمّل تحميلًا زائدًا.
مراجعة
يجعل تحميل المعاملات الحسابية تحميلًا زائدًا الأنواع الشبيهة بالقيم مقروءة كأنها رياضيات.
- أعلِن عنها باستخدام
public staticوالكلمة الأساسيةoperator. - يجب أن يكون أحد المعاملات على الأقل من النوع الذي يحتوي الأسلوب.
- أعد قيمة جديدة، ولا تعدّل القيم الداخلة مطلقًا.
- وفّر ترتيبي القيمتين الداخلتين في العمليات الحسابية ذات النوعين المختلطين.
الأسئلة الشائعة
هل درس «تحميل عوامل الحساب الزائد» مجاني؟
نعم — نص درس «تحميل عوامل الحساب الزائد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحميل عوامل الحساب الزائد»؟
عرّفوا + و- و* لأنواعكم الخاصة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تحميل عوامل الحساب الزائد»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحميل عوامل الحساب الزائد
- تحميل عوامل المقارنة الزائد
- التحويلات المعرّفة من المستخدم
- أفضل ممارسات تحميل العوامل الزائد