Operator Overloading in VB.Net & C#


بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم
كما نعلم جمعيا فإن لغتي VB.Net و C# توفران مجموعة من العوامل الاساسية لتنفيذ العمليات الأساسية كالجمع والضرب على الأنواع الرئيسية مثل الأرقام والنصوص
فعند تنفيذ الكود التالي
VB.Net
 
C Sharp
فقيمة C الآن تساوي 46 ونفس الفكرة تنطبق على النصوص فبعد تنفيذ الكود التالي
VB.Net
C Sharp
فقيمة C الآن تساوي "Codingproc" إنه نفس "العامل"(+) الذي استخدمناه في المثال السابق إذا تم تطبيقه على أنواع رقمية فإنه يقوم بجمعها وإذا تم تطبيقه على أنواع نصية فإنه يقوم بوصلها.

لكن ماذا إذا أردت أن أن أطبقه على أنواع أخرى من إنشائي لنفترض انه لدي الكلاس
مجلد الذي يحتوي على اسماء عدد معين من الملفات ،وهذا هو الكود الخاص به:
 
VB.Net
C Sharp


منطقياً أو على أرض الواقع يمكنك دمج مجلدين معاً لينتج لديك مجلد يحتوي على الملفات الموجودة في المجلدين السابقين ،لنجرب ان نفعل ذلك في برنامجنا سيكون الكود الخاص بك مشابهاً للكود التالي 
VB.Net

C Sharp

 الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه لا يمكن تطبيق العامل (+) على الكلاس Folder، ولحل هذه المشكلة توفر لك لغتي VB.Net و C# الكلمة Operator التي تمكنك من تحديد طريقة إستجابة الكلاس او الستركتشر للعامل (مثل [+] في مثالنا) والتي لا تستخدم إلا مع المحددين (محددات الوصول) Public و Shared (الذي يعرف بـStatic في لغة C#)
اما عن طريقة استخدامها فهي مشابهة للـ Functions بشكل كبير لكن تختلف معها في أنه بدل إستخدام الكلمة Function نستخدم الكلمة Operator (هذا بالنسبة لمستخدمي لغة VB.Net).

يبدو ان الفكرة لم تضح لديك إنظر إلى الكود التالي وهو كود الكلاس Folder بعد تعديله ليصبح قابلاً للجمع
 
VB.Net
C Sharp



الآن إذا أعدنا تنفيذ كود الجمع الذي بالأعلى فسيطبع البرنامج


الآن ما هي العوامل التي يمكننا تحديد طريقة إستجابة الكلاس لها
VB.Net
العامل المعاملات
+, -, *, /, \, ^, &, Like, And, Mod, Or, Xor يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
=, <> يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
IsTrue, IsFalse يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر

C Sharp
العامل المعاملات
+, -, *, /, ^, &, %, | يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
==, != يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
true, false يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
++, --, ~ يأخذ عامل واحد من نفس نوع الكلاس

 حينما تقوم بكتابة طريقة إستجابة كلاس لعامل ثنائي (أي يقبل معاملين(two arguments)) فلا يجب ان يكون المعاملين من نفس النوع فــفي الكلاس Folder في الأعلى العامل (+) يأخذ معاملين من نوع Folder وهذا ليس ضروري يمكننا كتابة العامل (+) للكلاس Folder مرة أخرى ليأخذ معاملين الأول نصي والثاني من نوع Folder ويضيف المعامل الأول إلى الملفات في المجلد ليصبح الكلاس

VB.Net
C Sharp



وليصبح كود الجمع 
VB.Net
C Sharp



وستكون نتيجة التنفيذ



لنجرب عامل آخر عامل المساواة على سبيل المثال ،عندما تقوم بمقارنة مجلدين في الواقع فما ستقوم به هو إنك سترى إن كان المجلدين يحتويان على نفس الملفات ،وإذا حاولت التعديل على الكلاس Folder فسيصبح قريبا للكود التالي
VB.Net
C Sharp



لنحاول الآن ان نقارن مجلدين يحتويان نفس الملفات

VB.Net
C Sharp

  الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه يجب عليك ان تحدد طريقة إستجابة الكلاس Folder للعامل <> في VB.Net و != في C# ،وسبق أن ذكرت هذا في الجدول في الأعلى
"وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر" لكن ضربت لك هذا المثال لأوضح لك الفكرة ،الآن لنعدل كود الكلاس Folder حتى يصبح قابلا للمقارنة.

VB.Net
C Sharp



ثم إذا نفذت كود المقارنة الذي بالأعلى فستكون النتيجة


 =====================================================

إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان  اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته
DoneByA

ليست هناك تعليقات:

إرسال تعليق

يمكنك النقل من المدونة كيف ما تشاء وبدون ذكر المصدر