في برمجة الحاسوب، يعد تحميل زائد للعملية (بالإنجليزية: operator overloading)، والذي يطلق عليه أحيانًا تعدد الأشكال المخصص للمشغل، حالة محددة من تعدد الأشكال، حيث يكون لدى العوامل المختلفة تنفيذات مختلفة اعتمادًا على قيمهم (arguments). يتم تعريف التحميل الزائد للمشغل بشكل عام بلغةبرمجة أو بواسطة مبرمج أو كليهما.
الدافع
عامل التحميل الزائد هو تجميل (سُكر) للبنية نحوي، ويستخدم لسماحه للبرمجة باستخدام التدوين الأقرب إلى نطاق الهدف ويسمح للأنواع المعرّفة من قبل المستخدم بمستوى مماثل من الدعم النحوي مثل الأنواع المضمنة في اللغة.[1] يعتبر ذلك شائعاً، على سبيل المثال، في الحوسبة العلمية، حيث يسمح ذلك بمعالجة أو التلاعب بتمثيلات الحوسبة للكائنات الرياضية بنفس البنية النحوية كما في الورق. لا يؤدي عامل التحميل الزائد إلى تغيير القوة التعبيرية للغة (للدوال)، حيث يمكن محاكاتها باستخدام استدعاءات الدوال. على سبيل المثال، ضع في الاعتبار المتغيرات أ، ب، ج لبعض الأنواع المعرفة من قبل المستخدم ، مثل المصفوفات:
a, b, c
في لغة تدعم عامل التحميل الزائد، ومع الافتراض المعتاد بأن عامل التشغيل * له أسبقية أعلى من عامل التشغيل +، فهذه طريقة موجزة للكتابة:
Add(a, Multiply(b, c))
ومع ذلك ، فإن الصيغة النحوية السابقة تعكس الاستخدام الرياضي الشائع.
أمثلة
في هذه الحالة، يتم تحميل عامل التشغيل الزائد للسماح بالإضافة على نوع وقت "Time" معرّف من قبل المستخدم (في سي++):
الإضافة هي عملية ثنائية، مما يعني أن لها معاملين . في سي++، القيم التي يتم تمريرها هي العوامل، والكائن temp هو القيمة التي تم إرجاعها.
يمكن أيضًا تعريف العملية كطريقة صنف واستبدال lhs بالقيمة الخفية this؛ لكن هذا يجبر المعامل الأيسر على أن يكون من النوع Time :
// This "const" means that |this| is not modified.// \// ------------------------------------\//// VTimeTime::operator+(constTime&rhs)const{Timetemp=*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;returntemp;}
لاحظ أن العامل الأحادي المحدد كطريقةصنفية لن يتلقى أي قيمة واضحة (يعمل فقط من this):
في المثال الأخير، يتم التحميل الزائد للعامل داخل الصنف التي هي نفس الأمثلة السابقة. في سي++، بعد التحميل الزائد لعامل أقل من عامل التشغيل (>) ، يمكن استخدام دوال الفرز القياسية لفرز بعض الأصناف.