Operator Overloading in C#

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Operator Overloading in C#: चूंकि C# एक Object Oriented Programming Language है, जिसमें हम किसी Real World Object को Exactly उसी तरह से Represent करने की क्षमता प्राप्त करते हैं, जिस तरह से वह Object Real World में होता है और इसी Concept के अन्तर्गत C# में Operator Overloading को Include किया गया है।

सामान्‍यत: जब हम दो Integer Values को आपसे में Addition Operator द्वारा जोडते हैं, तो दो Integer Values को आपस में जोडकर उनके योग को किस तरह से Return करना है, इस बात की जानकारी C# Compiler को होती है।

इसी तरह से जब हम दो Strings को आपस में जोडने के लिए Addition Operator को Use करते हैं, तो C# Compiler को पता होता है कि दो Strings को आपस में किस तरह से Concatenate करना है और क्या Resultant String Return करना है।

लेकिन जब हम हमारे द्वारा Created किसी Complex Type या Coordinate Type के दो Objects को आपस में जोडते हैं, तब C# Compiler को इस बात की जानकारी नहीं होती, कि दो Complex Type Objects या दो Coordinate Type Objects को आपस में Addition Operator का प्रयोग करके किस तरह से जोडा जाए और क्या Result Return किया जाए।

इसलिए सामान्‍यत: जब हमें इस तरह से किसी Complex Type या Coordinate Type के Objects को आपस में जोडना होता है, तो हम हमारा स्वयं का Addition Method Create करते हैं। जैसे:

File Name: OperatorOverloadingBasics.cs
using System;

namespace CSharpClass
{
    class Coordinate
    {
        int x { get; set; }
        int y { get; set; }

        public Coordinate() { }
        public Coordinate(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public void Position(string type)
        {
            Console.WriteLine("{0} Position:{1},{2}", type, x, y);
        }

        public Coordinate Plus(Coordinate operand)
        {
            Coordinate temp = new Coordinate();
            temp.x = this.x + operand.x;
            temp.y = this.y + operand.y;
            return temp;
        }
    }

    class OperatorOverloadingBasic
    {
        static void Main()
        {
            Coordinate pixel1 = new Coordinate(12, 21);
            Coordinate pixel2 = new Coordinate(12, 21);

            Coordinate calculated;
            calculated = pixel1.Plus(pixel2);
            calculated.Position("Pixel");
        }
    }
}
Output:
	Actual Pixel Position: 24,42

हालांकि ये Program Normal तरीके से दो Coordinate Type के Objects की X,Y Position को आपस में जोडकर उनका योग Return कर रहा है। लेकिन Real World में जोडने का काम “Plus” नाम से नहीं बल्कि “+” Symbol से किया जाता है।

इसलिए C# तभी वास्तव में Object Oriented हो सकता है, जबकि ये हमें Real World Objects को ठीक उसी तरह से Computer में Logically Represent व Behave करने की सुविधा दे, जिस तरह से वह Object Real World में Represent होता है और Behave करता है। यानी हालांकि हम इस Program में भी निम्नानुसार Statement के माध्‍यम से दो Coordinate Type के User Defined Types के Objects को Add कर रहे हैं:

calculated = pixel1.Plus(pixel2);

लेकिन यदि हम इसी Statement को निम्नानुसार तरीके से लिख सकें:

calculated = pixel1 + pixel2 ;

तो ही हम C# को Perfect Object Oriented Language कह सकते हैं। C# हमें हमारे Custom Types के लिए Operators को इस प्रकार से Use करने की सुविधा जिस तरीके से Provide करता है, उसे ही Operator Overloading के नाम से जाना जाता है।

यानी C# के Operator Overloading Concept के आधार पर हम हमारे द्वारा Create किए जाने वाले Structure व Class Type के Objects के लिए Operators को Overload कर सकते हैं और C# Compiler को इस बात का Instruction दे सकते हैं कि जब हम हमारे Custom Types के Objects को Operand की तरह Use करें, तो Specify किए जाने वाले Operator को उन Custom Types के Operands के साथ किस तरह का Operation Perform करना है।

चूंकि जब हम हमारे Custom Types के लिए Operator को कुछ अलग तरह से Behave करने हेतु Program करते हैं, तो C# Compiler को Program के Runtime में, Use किए गए Operands के आधार पर इस बात का पता लगाना पडता है, कि उसे Custom Type के Objects के साथ Use किए गए Operator के माध्‍यम से किस तरह का Operation Perform करना है।

यानी Compiler पर Specified Operands के आधार पर Specified Operator के लिए Appropriate Operation Perform करने का Extra Load पडता है। इसीलिए इस प्रक्रिया को Overloading या Operator Overloading कहा जाता है। क्योंकि C# Compiler को Runtime में उस Operator से Associated उपयुक्त Method को Search करना पडता है, जिसे Execute करना है।

जबकि Primitive Types के Data के साथ Operators को Use करने पर C# Compiler को पहले से ही पता होता है कि किस तरह के Data के लिए किस Operator को Use करने पर उसे किस तरह का Operation Perform करना है।

Operator Overloading Concept का प्रयोग करके हम C# के ज्यादातर Operators को किसी Specific तरह का Operation Perform करने के लिए Reprogram कर सकते हैं। परिणामस्वरूप हम हमारी जरूरत के अनुसार हमारे Custom Types के लिए Operators को Overload करके उसी तरह से Use कर सकते हैं, जिस तरह से C# के Primitive Types के लिए Operators को Use किया जाता है।

हालांकि हम C# के ज्यादातर Operators को अपने Custom Type (Class/Structure) के लिए Overload कर सकते हैं, लेकिन हम C# के सभी Operators को Overload नहीं कर सकते। C# के जिन Operators को Custom Types के लिए Overload किया जा सकता है, उनकी जानकारी निम्नानुसार है:

C# Operator Overloadability
+, -,! , ~, ++, –, true, false These unary operators can be overloaded.
+, -, *, /, %, &, |, ^, <<, >> These binary operators can be overloaded.
==,!=, <, >, <=, >= These comparison operators can be overloaded. C# demands that “like” operators (i.e., < and >, <= and >=, == and !=) are overloaded together.
[] The [] operator cannot be overloaded. As you saw earlier in this chapter, however, the indexer construct provides the same functionality.
() The () operator cannot be overloaded. As you will see later in this chapter, however, custom conversion methods provide the same functionality.
+=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= Shorthand assignment operators cannot be overloaded; however, you receive them as a freebie when you overload the related binary operator.

जब हम Operator Overloading की बात करते हैं, तो हमें हमेंशा इस बात को ध्‍यान रखना होता है कि हम केवल Structure व Class को ही Overload कर सकते हैं, अन्‍य किसी भी Type को C# में Overload नहीं किया जा सकता।

क्योंकि Structure व Class ही दो ऐसे Programming Constructs हैं, जिन्हें किसी Real World Object को Computer Program में Logically Represent करने के लिए Define किया गया है। जबकि अन्‍य सभी Programming Constructs को वास्तव में C# Program को सरल बनाने व Reusability की सुविधा प्राप्त करने के लिए ही Implement किया गया है।

जब हम किसी Operator को अपने Custom Type के लिए Overload करना चाहते हैं, तो हमें हमारे Custom Type में operator x() नाम का एक Method Define करना होता है और इस Method में ही हमें उन Functionalities को Specify करना होता है, जिन्हें Operator को Use करने पर Perform करना होता है।

यानी यदि हम Coordinate Types के Objects को आपस में जोडने के लिए “+” Operator को Overload करना चाहें, तो हमें हमारी Coordinate Class में operator +() नाम का Method Define करना होगा और इस Method में हमें उन Operations को Specify करना होगा, जिन्हें “+” Operator को Use करने पर Execute होना है।

चूंकि हम हमारे पिछले Program के Plus() Method द्वारा जो Functionality प्राप्त कर रहे हैं, हमें वही Functionality “+” Operator द्वारा प्राप्त करनी है। यानी हमें दो Coordinate Objects को “+” Symbol द्वारा Add करना है। इसलिए हम हमारे पिछले Program के Plus() Method को ही निम्नानुसार तरीके से Modify कर सकते हैं:

        public Coordinate operator + (Coordinate operand)
        {
            Coordinate temp = new Coordinate();
            temp.x = this.x + operand.x;
            temp.y = this.y + operand.y;
            return temp;
        }

जैसाकि हम जानते हैं कि Unary Operator को अपना Operation Perform करने के लिए केवल एक ही Operand की जरूरत होती है। इसलिए Unary Operator को Overload करने पर हमें हमारे operator x() Method में केवल एक Single Parameter को Specify करना होता है।

जबकि Binary Operators को अपना Operation Perform करने के लिए हमेंशा दो Operands की जरूरत होती है। इसलिए Binary Operator को Overload करने पर हमें हमारे operator x() Method में Double Parameter को Specify करना होता है।

यानी यदि हम हमारे पिछले Overloaded Method के Code Segment को देखें, तो उसमें केवल एक ही Parameter Specified है, इसलिए हम इस Method को Unary “+” Operator की Overloading के रूप में Use कर सकते हैं, जबकि हमारे Program में हम दो Coordinate Type को आपस में जोड रहे हैं।

इसलिए हमें “+” Operator को Binary Operator की तरह Overload करना होगा, यानी हमें हमारे उपरोक्त Code Segment को निम्नानुसार Modify करना होगा, ताकि वह Binary “+” Operator को Overload कर सके न कि Unary “+” Operator को:

        public Coordinate operator + (Coordinate operand1, Coordinate operand2)
        {
            Coordinate temp = new Coordinate();
            temp.x = this.x + operand.x;
            temp.y = this.y + operand.y;
            return temp;
        }

इसके अलावा C# में जब हम किसी Operator को Overload करने के लिए operator x() Method को Use करना चाहते हैं, तो ये जरूरी होता है कि हमारा Method publicstatic Modifiers के साथ Specified हो, अन्‍यथा C# हमारे Method को Operator Overloaded Method नहीं मानता।

इसलिए यदि हम हमारे उपरोक्त Code Segment को Binary “+” Operator की Overloading के लिए Define करना चाहते हैं, तो हमें इसे निम्नानुसार तरीके से public static Keywords के साथ Specify करना होगा:

        public static Coordinate operator + (Coordinate operand1, Coordinate operand2)
        {
            Coordinate temp = new Coordinate();
            temp.x = this.x + operand.x;
            temp.y = this.y + operand.y;
            return temp;
        }

चूंकि जब हम static Keyword Use करते हैं, तो उपरोक्त Method एक Static Method यानी Class Level Method बन जाता है और किसी Class Level Method में हम this Keyword का प्रयोग नहीं कर सकते, क्योंकि this Keyword हमेंशा Current Instance को Represent करता है।

इसलिए इस Method से हमें this Keyword को Remove करना होगा, क्योंकि न तो हम किसी static Method में this Keyword को Use कर सकते हैं, न ही हमें हमारे इस Method में this Keyword की जरूरत है।

साथ ही इस Static Method में दोनों Add होने वाले Objects Parameter के रूप में प्राप्त हो रहे हैं, इसलिए हमें इन Parameters के रूप में आने वाले Objects के Members को ही Add करना है। इसलिए हमारा Last Modified Method कुछ निम्नानुसार होगा:

    	public static Coordinate operator +(Coordinate operand1, Coordinate operand2 )
	{
		Coordinate temp = new Coordinate();
		temp.x = operand1.x + operand2.x;
		temp.y = operand1.y + operand2.y;
		return temp;
	}

अब यदि हम इस Static Method के आधार पर अपने पिछले Program को Modify करें, तो हमारा Modified Program कुछ निम्नानुसार होगा:

File Name: Binary+OperatorOverloading.cs
using System;

namespace CSharpClass
{
    class Coordinate
    {
        int x { get; set; }
        int y { get; set; }

        public Coordinate() { }
        public Coordinate(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public void Position(string type)
        {
            Console.WriteLine("{0} Position: {1},{2}", type, x, y);
        }

        public static Coordinate operator +(Coordinate operand1, Coordinate operand2)
        {
            Coordinate temp = new Coordinate();
            temp.x = operand1.x + operand2.x;
            temp.y = operand1.y + operand2.y;
            return temp;
        }
    }

    class OperatorOverloadingBasic
    {
        static void Main()
        {
            Coordinate pixel1 = new Coordinate(12, 21);
            Coordinate pixel2 = new Coordinate(12, 21);

            Coordinate calculated;
            calculated = pixel1 + pixel2;
            calculated.Position("Actual Pixel");
        }
    }
}

Output:
	Actual Pixel Position: 24,42

जैसाकि हम इस Program का Output देख सकते हैं, जो कि Exactly पिछले Program की तरह ही दिखाई दे रहा है।

लेकिन इस Program में हमने पिछले Program की तरह दो Coordinate Objects को आपस में जोडने के लिए Plus() Method को Use नहीं किया है। बल्कि निम्नानुसार तरीके से “+” Operator का प्रयोग किया है:

calculated = pixel1 + pixel2;

हम ऐसा इसलिए कर सकते हैं क्योंकि हमने C# द्वारा Operator Overloading के लिए Provided operator x() Method को अपनी Coordinate Class में दो Coordinate Objects को आपस esa “+” Operator का प्रयोग करते हुए जोडने के लिए Define किया है।

C# में Operator Overloading के साथ कुछ Restrictions भी हैं, जो कि C++ में नहीं थीं। C# में हम Increment/Decrement Operators की Overloading तो कर सकते हैं, लेकिन हम Pre या Post Version Create नहीं कर सकते हैं। साथ ही हम Overloading करके नया Operator Create नहीं कर सकते हैं न ही Operator को Use करने के Syntax को Change कर सकते हैं।

इसके अलावा हम पहले से Defied Operators की Working को भी Modify नहीं कर सकते। यानी Default रूप से Operators जो काम करते हैं, वे Operators वही काम करते हैं। हम उन्हें Modify नहीं कर सकते।

उदाहरण के लिए दो Integer Values को जोडने के लिए “+” Operator Use करने पर वह हमेंशा दोनों Integer Values को Integer Values की तरह ही जोडेगा। हम “+” Operator को पहली Integer Values से दूसरी Integer Value को घटाने के लिए Overload नहीं कर सकते।

इसी तरह से हम किसी Operator के Precedence या Associatively को भी Modify नहीं कर सकते। यानी किसी Expression में जो Operator Left to Right Flow होता है वह Left to Right ही Flow होगा तथा जो Operator किसी Expression में पहले Execute होता है, वह पहले ही Execute होगा।

Automatically Overloaded Operators

जब हम C# में किसी Binary Operator को Overload करते हैं, तो उससे Associated Assignment Operator Automatically Overload हो जाता है। यानी यदि हम हमारे पिछले Program की तरह “+” Operator को Overload करते हैं, तो C# Automatically “+=” Operator को Overload कर देता है।

इसी तरह से यदि हम “-=” Operator को Overload करना चाहते हैं, तो हमें केवल ““ Operator को ही Overload करना होता है। C# Compiler Automatically “-=” Operator को Overload कर देता है। इसलिए यदि हम चाहें, तो अपने पिछले Program के Main() Method को निम्नानुसार तरीके से भी Define कर सकते हैं:

File Name: AutomaticOperatorOverloading.cs
using System;

namespace CSharpClass
{
    class Coordinate
    {
//Same as before
    }

    class OperatorOverloadingBasic
    {
        static void Main()
        {
            Coordinate pixel1 = new Coordinate(12, 21);
            Coordinate pixel2 = new Coordinate(12, 21);

            pixel1 += pixel2;
            pixel1.Position("Actual Pixel");
        }
    }
}

Output:
	Actual Pixel Position: 24,42

इस Program में हमने केवल हमारे Main() Method में ही निम्नानुसार दो Statements को Change किया है:

pixel1 += pixel2;
pixel1.Position(“Actual Pixel”);

और हमें वही Output प्राप्त हो रहा है, जो पिछले Program का प्राप्त हो रहा था। क्योंकि इस Program में हमने “+” Operator को Overload किया है, जिसकी वजह से हमें Automatically हमारी Coordinate Class के लिए “+=” Overloaded Operator प्राप्त हो जाता है।

परिणामस्वरूप इस Program में हमने इसी Overloaded Operator को Use करते हुए pixe1 Object के मानों को pixel2 Object के मानों से जोडकर फिर से pixel1 Object में Store कर दिया है। फलस्वरूप जब हम pixel1 Object के मानों को Display करते हैं, तो हमें पिछले Program के समान ही Output प्राप्त हो जाता है।

C# Partial Class
Operator Overloading in C#.NET

******

ये पोस्‍ट Useful लगा हो, तो Like कर दीजिए।

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।