مصطلحات:

  • أوبيريتور = Operator

  • كلاس = class

  • ميثود = Method

  • بروبيرتي = Property

  • ستاتيك = static

  • فاريابل = Variable

  • بارمتر = Parameter

  • نل = null

  • أوبجكت = Object

  • ترو = true

  • فلص = false

  • بروجكت = Project

  • كونسول = Consol

الأوبيرتور هي الرموز المستخدمة في لغة السي شارب

مثل رموز العمليات الرياضية و المساواة والمقارنة والعمليات المنطقية و الثنائية وغيرها من الكلمات المفتاحية والاختصارات

وقد تم تقسيم الـ أوبيريتور إلى عدة أصناف :

منها الرموز الأحادية والتي تقبل بارمتر وحيد ليتم تطبيق العملية عليه مثل - لعكس الإشارة أو ++ لزيادة المتغير بمقدار واحد و ! لعكس الحالة المنطقية

ومنها الثنائية التي تحتاج بارمترين لتطبيق العملية مثل رمز * لجداء عددين أو | للجمع المنطقي أو << للإزاحة الثنائية

ومنها ما يقبل ورود البارمتر قبله أو بعده

كمثال ++ و -- حيث يمكن أن تأتي قبل البارمتر أو بعدها ولكل واحدة تعامل مختلف

للاطلاع على جميع الـ أوبيريتور وتقسيماتها يمكن مراجعة الصفحة التالية :

http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

بعض هذه الرموز سمحت اللغة بإعادة تخصيصها أي إعادة تعريف عملها بما يناسب الطلب

والـ أوبيريتور المسموح بإعادة تخصيصها هي :

+ - ! ~ ++ -- true false من الرموز أحادية البارمتر

و

+ - * / % & | ^ << >> == != > < >= <= من الرموز ثنائية البارمترات

وما عداها

لا يسمح بإعادة تخصيصها ولكن بعض الرموز يكون إعادة تخصيصها متعلق بإحدى الرموز السابقة

مثلا : += وهي جمع قيمة إلى بارمتر يكون بإعادة تخصيص رمز الجمع + ومثله بقية الرموز التي تقبل الاستخدام قبل إشارة المساواة =

سنضرب مثالا واحدا الآن على إعادة التخصيص ومن ثم سنتبع أمثلة أخرى في مواضيع أخرى إن شاء الله.

العمليات معظمها معرف من أجل التعامل مع البارمترات العددية مثل الأرقام الصحيحة و العشرية والمنطقية

ولكنها ليست معرفة من أجل الـ كلاس

بمعنى عندما تعرف كلاس ما و تصرح عن اثنين بروبيرتي من هذا الكلاس وتقوم بجمعها يعطي خطأ أثناء الترجمة

تقول أنه لا يمكن تطبيق عملية الجمع على بارمترين من هذا الكلاس

وقس عليه الرموز الأخرى

لو تلاحظون أنه ورد في المجموعة الاولى القابلة للتخصيص الكلمتين true false وكما نعلم أنها تعبر عن قيمة بوليانية لمتغير من النوع bool

فكيف يمكن إعادة تخصيصها.

نعم تخصيصها هو من أجل قسم الفحص المنطقي في عبارة الشرط if والحلقات المشروطة while والشرط المختزل ? : وأي مكان يستوجب فحص تعبير ما فيما إذا كانت نتيجته ترو أو فلص

وسنرى كيف يمكن الاستفادة من هذه الميزة في اختزال تعبير كلنا يستخدمه وبكثرة

وهو فحص أوبجكت فيما إذا كان موجود أو لا أي قيمته نل .

كمثال :

        Class1 obj = null;
        if(obj != null)
        {
            //Do some thing
        }
        else
        {
            //Do other thing
        }

فلو كان الـ فاريابل من النوع Class1 مثلا وقمتا بوضع الميثود الـ ستاتيك التالي داخله :

    public static bool operator false(Class1 obj)
    {
        return obj == null;
    }

    public static bool operator true(Class1 obj)
    {
        return obj != null;
    }

    public static bool operator !(Class1 obj)
    {
        return obj == null;
    }

حينها نستطيع اختصار الشرط كما يلي :

        if(obj)
        {
            //Do some thing
        }
        else
        {
            //Do other thing
        }

أي وضعنا ضمن قوسي الشرط فقط الـ فاريابل، دون المساواة والكلمة نل بينما سابقا كان سيعطي خطأ أثناء الترجمة والسبب أنه عندما وجد إعادة التخصيص أصبح بإمكانه تنفيذه والعودة بنتيجة بوليانية

وكما تلاحظون استخدمناه في التحقق من وجود الأوبجكت

وطبعا الميثود الأول والثاني متلازمان أي لا يجوز تخصيص ترو دون الآخر فلص وأما إعادة تخصيص ! وهو في حال احتجنا أن يكون الشرط هو عكس النتيجة

وهذا هو الكود كاملا لتجربوه افتحوا بروجكت كونسول وضعوه وجربوه خطوة خطوة لترو أن النتيجة واحدة

وبالطبع يمكن تعميم الفائدة بإنشاء كلاس أساسي فيه التخصيص ونجعل كل كلاس جديد يرثه ليرث جميع التخصيصات

وسنرى ذلك في دروس قادمة

دمتم بخير.

الكود :

namespace OperatorOverloading
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 obj = null;
            if(obj != null)
            {
                //Do some thing
            }
            else
            {
                //Do other thing
            }

            if(obj)
            {
                //Do some thing
            }
            else
            {
                //Do other thing
            }
        }
    }

    public class Class1
    {
        public static bool operator false(Class1 obj)
        {
            return obj == null;
        }

        public static bool operator true(Class1 obj)
        {
            return obj != null;
        }

        public static bool operator !(Class1 obj)
        {
            return obj == null;
        }
    }


}