تحميل زائد للعملية
في برمجة الحاسوب، يعد تحميل زائد للعملية (بالإنجليزية: operator overloading)، والذي يطلق عليه أحيانًا تعدد الأشكال المخصص للمشغل، حالة محددة من تعدد الأشكال، حيث يكون لدى العوامل المختلفة تنفيذات مختلفة اعتمادًا على قيمهم (arguments). يتم تعريف التحميل الزائد للمشغل بشكل عام بلغة برمجة أو بواسطة مبرمج أو كليهما. الدافععامل التحميل الزائد هو تجميل (سُكر) للبنية نحوي، ويستخدم لسماحه للبرمجة باستخدام التدوين الأقرب إلى نطاق الهدف ويسمح للأنواع المعرّفة من قبل المستخدم بمستوى مماثل من الدعم النحوي مثل الأنواع المضمنة في اللغة.[1] يعتبر ذلك شائعاً، على سبيل المثال، في الحوسبة العلمية، حيث يسمح ذلك بمعالجة أو التلاعب بتمثيلات الحوسبة للكائنات الرياضية بنفس البنية النحوية كما في الورق. لا يؤدي عامل التحميل الزائد إلى تغيير القوة التعبيرية للغة (للدوال)، حيث يمكن محاكاتها باستخدام استدعاءات الدوال. على سبيل المثال، ضع في الاعتبار المتغيرات أ، ب، ج لبعض الأنواع المعرفة من قبل المستخدم ، مثل المصفوفات:
في لغة تدعم عامل التحميل الزائد، ومع الافتراض المعتاد بأن عامل التشغيل
ومع ذلك ، فإن الصيغة النحوية السابقة تعكس الاستخدام الرياضي الشائع. أمثلةفي هذه الحالة، يتم تحميل عامل التشغيل الزائد للسماح بالإضافة على نوع وقت "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;
}
الإضافة هي عملية ثنائية، مما يعني أن لها معاملين . في سي++، القيم التي يتم تمريرها هي العوامل، والكائن // 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;
}
لاحظ أن العامل الأحادي المحدد كطريقة صنفية لن يتلقى أي قيمة واضحة (يعمل فقط من 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_;
};
في المثال الأخير، يتم التحميل الزائد للعامل داخل الصنف التي هي نفس الأمثلة السابقة. في سي++، بعد التحميل الزائد لعامل أقل من عامل التشغيل (>) ، يمكن استخدام دوال الفرز القياسية لفرز بعض الأصناف. انظر أيضًاالمراجع
|