| تعددية الأشكال |
| --- |
| تعددية الأشكال المخصصة  |
| * وظيفة التحميل الزائد
* عامل التحميل الزائد
 |
| تعددية أشكال الوسائط  |
| * وظيفة عامة
* برمجة عامة
 |
| تصنيف فرعي  |
| * وظيفة افتراضية
* إرسال ديناميكي
* إرسال مزدوج
* إرسال متعدد
 |
| * ع
* ن
* ت
 |

في برمجة الحاسوب، يعد **تحميل زائد للعملية** (بالإنجليزية: operator overloading)‏، والذي يطلق عليه أحيانًا *تعدد الأشكال المخصص للمشغل*، حالة محددة من تعدد الأشكال، حيث يكون لدى العوامل المختلفة تنفيذات مختلفة اعتمادًا على قيمهم (arguments). يتم تعريف التحميل الزائد للمشغل بشكل عام بلغة برمجة أو بواسطة مبرمج أو كليهما.

الدافع
------

عامل التحميل الزائد هو تجميل (سُكر) للبنية نحوي، ويستخدم لسماحه للبرمجة باستخدام التدوين الأقرب إلى نطاق الهدف ويسمح للأنواع المعرّفة من قبل المستخدم بمستوى مماثل من الدعم النحوي مثل الأنواع المضمنة في اللغة. يعتبر ذلك شائعاً، على سبيل المثال، في الحوسبة العلمية، حيث يسمح ذلك بمعالجة أو التلاعب بتمثيلات الحوسبة للكائنات الرياضية بنفس البنية النحوية كما في الورق. لا يؤدي عامل التحميل الزائد إلى تغيير القوة التعبيرية للغة (للدوال)، حيث يمكن محاكاتها باستخدام استدعاءات الدوال. على سبيل المثال، ضع في الاعتبار المتغيرات أ، ب، ج لبعض الأنواع المعرفة من قبل المستخدم ، مثل المصفوفات:

`a, b, c`

في لغة تدعم عامل التحميل الزائد، ومع الافتراض المعتاد بأن عامل التشغيل `*` له أسبقية أعلى من عامل التشغيل `+`، فهذه طريقة موجزة للكتابة:

`Add(a, Multiply(b, c))`

ومع ذلك ، فإن الصيغة النحوية السابقة تعكس الاستخدام الرياضي الشائع.

أمثلة
-----

في هذه الحالة، يتم تحميل عامل التشغيل الزائد للسماح بالإضافة على نوع وقت "Time" معرّف من قبل المستخدم (في سي++): 

```
Time operator+(const Time& lhs, const Time& rhs) {
 Time temp = lhs; 
 temp.seconds += rhs.seconds;
 temp.minutes += temp.seconds / 60;
 temp.seconds %= 60;
 temp.minutes += rhs.minutes;
 temp.hours += temp.minutes / 60;
 temp.minutes %= 60;
 temp.hours += rhs.hours;
 return temp;
}

```
 الإضافة هي عملية ثنائية، مما يعني أن لها معاملين. في سي++، القيم التي يتم تمريرها هي العوامل، والكائن `temp` هو القيمة التي تم إرجاعها.

يمكن أيضًا تعريف العملية كطريقة صنف واستبدال `lhs` بالقيمة الخفية `this`؛ لكن هذا يجبر المعامل الأيسر على أن يكون من النوع `Time` :

```
// This "const" means that |this| is not modified.
// \
// ------------------------------------\
//
// V
Time Time::operator+(const Time& rhs) const {
 Time temp = \*this; // Copy |this| which is not to be modified.
 temp.seconds += rhs.seconds;
 temp.minutes += temp.seconds / 60;
 temp.seconds %= 60;
 temp.minutes += rhs.minutes;
 temp.hours += temp.minutes / 60;
 temp.minutes %= 60;
 temp.hours += rhs.hours;
 return temp;
}

```
 لاحظ أن العامل الأحادي المحدد كطريقة صنفية لن يتلقى أي قيمة واضحة (يعمل فقط من `this`):

```
bool Time::operator!() const {
 return hours == 0 && minutes == 0 && seconds == 0;
}

```
 غالبًا ما يكون عامل أصغر من (>) محمل بشكل زائد لفرز بنية أو صنف. 

```
class Pair {
 public:
 bool operator<(const Pair& p) const {
 if (x\_ == p.x\_) {
 return y\_ < p.y\_;
 }
 return x\_ < p.x\_;
 }

 private:
 int x\_;
 int y\_;
};

```
 في المثال الأخير، يتم التحميل الزائد للعامل داخل الصنف التي هي نفس الأمثلة السابقة. في سي++، بعد التحميل الزائد لعامل أقل من عامل التشغيل (>) ، يمكن استخدام دوال الفرز القياسية لفرز بعض الأصناف.

انظر أيضًا
----------

* تعدد الأشكال (علوم الكمبيوتر)
* روتين
* عامل (برمجة)

المراجع
-------

1. ↑  "[13] Operator overloading  Updated! , C++ FAQ". *web.archive.org*. 14 أغسطس 2011. مؤرشف من الأصل في 2020-08-22. اطلع عليه بتاريخ 2020-07-26. `{{استشهاد ويب}}`: no-break space character في `|عنوان=` في مكان 27 (مساعدة)صيانة الاستشهاد: BOT: original URL status unknown (link)

* أيقونة بوابةبوابة برمجة الحاسوب

|  |  |
| --- | --- |
| ضبط استنادي: وطنية عدلها في ويكي بيانات | 
* الملف الاستنادي المتكامِل (GND)

 |