Generics Base Class Constraint

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

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

BUY NOW DOWNLOAD READ ONLINE

Generics Base Class Constraint: Generic Type को Define करते समय उसे पता नहीं होता है कि उसे किस प्रकार के Data के साथ काम करने के लिए Define किया गया है, बल्कि Generic Type को ये बात पूरी तरह से Compile Time में तब पता चलती है, जब हम Constructed Type बनाने के लिए Generic Type के साथ किसी Parameter को Specify करते हैं।

हालांकि Generic Class की ये विशेषता विभिन्न प्रकार के Data के साथ काम करने के लिए काफी उपयोगी होती है। लेकिन ये विशेषता कुछ परिस्थितियों में Runtime Exceptions का कारण भी बनती है। क्योंकि हम Generic Type के लिए कभी भी ऐसे Members को Implement नहीं कर सकते, जो कि किसी Specific Type के Data के साथ ही Specific Type की Calculation Perform कर सकते हैं। इस बात को समझने के लिए हम निम्नानुसार एक Code Segment को उदाहरण के रूप में समझने की कोशिश करते हैं:

	static void Multiply<TYPE>(ref TYPE a, ref TYPE b)
	{
		return a * b;
	}

हालांकि ये Generic Method किसी भी Numerical Data के साथ तो Normal तरीके से काम करेगा, लेकिन यदि हम इस Generic Method को निम्नानुसार String Value के साथ Use करें:

Multiply<string>(“10″,”20”);

तो अब यही Generic Method हमें Runtime Exception Return करेगा, क्योंकि दो Numerical Values के लिए तो Multiply Generic Method Normal तरीके से काम करेगा लेकिन दो String Values का गुणा नहीं किया जा सकता और जब हम उपरोक्त Statement द्वारा दो String Values का गुणा करने की कोशिश करते हैं, तो Compiler हमें Error ही Return करता है।

यही बात Generic Classes पर भी Apply होती है, क्योंकि Generic Classes में Operations को Represent करने के लिए Methods Define किए जाते हैं और यदि किसी Generic Class में हम उपरोक्तानुसार Multiply नाम का Generic Method Define करते हैं, तो String Object के साथ प्रक्रिया करते समय ये Method Runtime Exception ही Return करेगा।

यानी सारांश ये हुआ कि हम सभी प्रकार की Generic Classes के साथ सभी प्रकार के Types को Specify नहीं कर सकते। बल्कि कुछ Generic Classes ऐसी हो सकती हैं, जो कि किसी Specific Type के साथ ही उपयुक्त तरीके से काम करने में सक्षम होते हैं, जबकि अन्‍य Type के साथ उसे Use करने पर वे ठीक तरह से काम नहीं करते।

ठीक वैसे ही जैसे उपरोक्त Multiply() नाम का Generic Method Numerical Values के लिए तो Normal तरीके से काम करेगा लेकिन String या किसी User Defined Type के लिए Normal तरीके से काम करे, ऐसा जरूरी नहीं है।

इसलिए जब हम Generic Classes Define करते हैं, तब हमें इस बात को ध्‍यान में रखना होता है कि हमारी Generic Class किस तरह के Data के साथ Normal तरीके से काम कर सकता है और किस तरह के Data के साथ नहीं और इस तथ्‍य के आधार पर हमें हमारी Generic Class को किन्हीं Particular Types के लिए Restrict करने की जरूरत पडती है, ताकि उन Specific Types को Generic Class के साथ Parameter की तरह Specify न किया जा सके।

Types को Restrict करने की इसी प्रक्रिया को Parameter Constraint के नाम से जाना जाता है, जहां हम C# द्वारा Provided किसी तरीके का प्रयोग करके इस बात को Specify कर देते हैं कि Generic Class किस Type Parameter को Accept करेगा और किस Type Parameter को Accept नहीं करेगा।

Parameter Constraint Specify करने के लिए C# हमें where Keyword Provide करता है। इस Keyword को हम Generic Class Define करते समय Parameters के साथ Use करके इस बात को निश्चित करते हैं कि हमारा Generic किस Type को Parameter के रूप में Accept कर सकता है। Constraint Specify करने के लिए हमें निम्न Syntax को Follow करना होता है:

	class ClassName<TYPE> where TYPE : constraints 
	{ 
		// ...
	}

इस Syntax में हमें constraints के स्थान पर Comma Separated List के रूप में Generic Class द्वारा Accepted Types की List Specify करनी होती है। C# में हम Constraints के रूप में निम्नानुसार चार प्रकार के Acceptable Constraints Specify कर सकते हैं:

Generics Base Class Constraint

Base Class Constraint हमें उस Base Class को Constraint के रूप में Specify करने की सुविधा देता है, जिसे हम हमारे Generic Class में Use कर सकते हैं। Base Class Constraint दो मुख्‍य काम करता है।

  • जब हम Base Class Constraint को Generic Class के साथ Specify करते हैं, तो Generic Class केवल उस Base Class अथवा उसकी किसी भी Derived Class को ही Parameter के रूप में Accept कर सकता है।
  • साथ ही उस Base Class या उसकी किसी Derived Class के Members इस Generic Class में Inherit हो जाते हैं, जिन्हें Generic Class उपयोग में ले सकता है।

यानी Base Class को Specify करके हम C# Compiler को इस बात की Information देते हैं, कि Generic Class उस Base Class Type या उसकी Derived Class Type के किसी भी Object के सभी Accessible Members को Access कर सकता है और वह Generic Class केवल Specified Base Class या उसकी किसी Derived Class को ही Parameter Type के रूप में Use कर सकता है। जबकि यदि हम किसी अन्‍य Type को Parameter के रूप में Specify करते हैं, तो C# Compiler Compile Time Error Generate करता है। Base Class Type को Constraint की तरह Use करते समय हमें निम्न Syntax को Follow करना होता है:

	class GenericClassName<TYPE> where TYPE : BaseClassType 
	{ 
		// ...
	}

जब हम Base Class Constraint को Use करते हैं, तब हमें एक बात हमेंशा ध्‍यान रखनी होती है कि हम Constraint के रूप में केवल एक ही Class को Specify कर सकते हैं, क्योंकि हम जब Base Class Constraint Use करते हैं, तो एक तरह से हम Generic Class को Base Class से Derive कर रहे होते हैं और C# Multiple Inheritance को Support नहीं करता।

इसलिए हम Base Class Constraint के रूप में एक Parameter Type के साथ एक से ज्यादा Base Classes को Specify नहीं कर सकते। Base Class Constraint को Use करते हुए हम निम्नानुसार एक Program Create करते हुए Base Class Constraint की Working को बेहतर तरीके से समझ सकते हैं:

File Name: BaseClassConstraints.cs
using System;

namespace CSharpGenerics
{
    class BaseClass
    {
        public void Display()
        {
            Console.WriteLine("This is BaseClass Method.");
        }
    }

    class DerivedClass : BaseClass { }

    class OtherClass
    {
        public void Display()
        {
            Console.WriteLine("This is OtherClass Method.");
        }
    }

    class GenClass<T> where T : BaseClass
    {
        T genObject;

        public GenClass(T argObject)
        {
            genObject = argObject;
        }

        public void DisplayMessage()
        {
            genObject.Display();
        }
    }

    class BaseClassConstraints
    {
        static void Main()
        {
            BaseClass baseObject = new BaseClass();
            DerivedClass derivedObject = new DerivedClass();
            OtherClass otherObject = new OtherClass();

            GenClass<BaseClass> genBaseObject = new GenClass<BaseClass>(baseObject);
            genBaseObject.DisplayMessage();

            GenClass<DerivedClass> genDerivedObject = new GenClass<DerivedClass>(derivedObject);
            genDerivedObject.DisplayMessage();

            //GenClass<OtherClass> genOtherObject = new GenClass<OtherClass>(otherObject);
            //genOtherObject.DisplayMessage();
        }
    }
}

// Output:
   This is BaseClass Method.
   This is BaseClass Method.

इस Program में हमने BaseClass, DerivedClass OtherClass नाम की तीन Normal Classes व GenClass नाम की एक Generic Class Define की है, जहां Generic Class का Implementation निम्नानुसार है:

    class GenClass<T> where T : BaseClass
    {
        T genObject;

        public GenClass(T argObject)
        {
            genObject = argObject; 
        }

        public void DisplayMessage()
        {
            genObject.Display();
        }
    }

इस Generic Class में हमने Base Class Constraint के रूप में where Keyword के बाद BaseClass को Specify किया है। इसलिए इस Generic Class के आधार पर Constructed Type Create करने के लिए हम Parameter के रूप में Base Class (BaseClass) या उसकी किसी Derived Class (DerivedClass) को तो Parameter Type की तरह Specify कर सकते हैं, लेकिन इनके अलावा किसी भी अन्‍य Type को Parameter Type की तरह Specify नहीं कर सकते।

जब ये Program Run होता है, तो निम्नानुसार Statements के माध्‍यम से Main() Method में सबसे पहले BaseClass, DerivedClass OtherClass Type के क्रमश: baseObject, derivedObject otherObject नाम के तीन Objects Create होते हैं:

            BaseClass baseObject = new BaseClass();
            DerivedClass derivedObject = new DerivedClass();
            OtherClass otherObject = new OtherClass();

फिर निम्न Statement द्वारा GenClass Type का genObject नाम का एक General Object Create किया जाता है:

GenClass<BaseClass> genBaseObject = new GenClass<BaseClass>(baseObject);

इस Statement में हम देख सकते हैं कि हमने Parameter Type के रूप में BaseClass Type को Specify किया है। इसलिए genBaseObject नाम का जो Object Create होता है, वह वास्तव में BaseClass Type का Object होता है। परिणामस्वरूप इस Statement में baseObject को जब Constructor में Pass किया जाता है, तो GenClass का Constructor वास्तव में BaseClass Type के लिए निम्नानुसार Modify हो जाता है:

    class GenClass<BaseClass> 
    {
        BaseClass genObject;

        public GenClass(BaseClass argObject)
        {
            genObject = argObject; 
        }

        public void DisplayMessage()
        {
            genObject.Display();
        }
    }

परिणामस्वरूप Create होने वाला Object एक प्रकार से BaseClass का Object होता है, इसलिए जब निम्नानुसार अगला Statement Execute होता है:

genBaseObject.DisplayMessage();

तो GenClass में Defined DisplayMessage() Method, BaseClass के Display() Method को Invoke करता है। क्योंकि GenClass, BaseClass Method के सभी Accessible Members को Access कर सकता है। परिणामस्वरूप हमें निम्नानुसार Output Message प्राप्त होता है:

This is BaseClass Method.

जिसे हमने BaseClass के Display() Method में Specify किया था। इसी तरह से जब Main() Method का निम्नानुसार अगला Statement Execute होता है:

GenClass<DerivedClass> genDerivedObject = new GenClass<DerivedClass>(derivedObject);

तो जैसाकि इस Statement में हम देख सकते हैं कि इस बार हमने Parameter Type के रूप में DerivedClass Type को Specify किया है। इसलिए genDerivedObject नाम का जो Object Create होता है, वह वास्तव में DerivedClass Type का Object होता है। परिणामस्वरूप इस Statement में derivedObject को जब Constructor में Pass किया जाता है, तो GenClass का Constructor वास्तव में DerivedClass Type के लिए निम्नानुसार Modify हो जाता है:

    class GenClass<DerivedClass> 
    {
        DerivedClass genObject;

        public GenClass(DerivedClass argObject)
        {
            genObject = argObject; 
        }

        public void DisplayMessage()
        {
            genObject.Display();
        }
    }

परिणामस्वरूप Create होने वाला Object एक प्रकार से DerivedClass का Object होता है, इसलिए जब निम्नानुसार अगला Statement Execute होता है:

genDerivedObject.DisplayMessage();

तो GenClass में Defined DisplayMessage() Method, DerivedClass के Display() Method को Invoke करता है क्योंकि GenClass, DerivedClass के सभी Accessible Members को Access कर सकता है।

चूंकि DerivedClass में Display() नाम का कोई Method Exist नहीं है, इसलिए Program Control DerivedClass की Parent Class यानी BaseClass में Display() नाम के Method को Search करके Execute कर देता है। परिणामस्वरूप हमें फिर से निम्नानुसार Output Message प्राप्त होता है:

This is BaseClass Method.

जिसे हमने BaseClass के Display() Method में Specify किया था। चूंकि Constraint के रूप में किसी Base Class को Parameter Type की तरह Specify करने पर हम उस Base Class व उसकी सभी Derived Classes को Generic Class में Parameter Type की तरह Specify कर सकते हैं, इसलिए हमें हमारे इस Program का उपरोक्तानुसार Output प्राप्त हो जाता है। लेकिन इसी Program में Specified निम्नानुसार दोनों Comment Lines को यदि हम Normal Lines में Convert करके Program को फिर से Run करें:

            //GenClass<OtherClass> genOtherObject = new GenClass<OtherClass>(otherObject);
            //genOtherObject.DisplayMessage();

तो अब ये Program Normal तरीके से Run नहीं होताए बल्कि Program में Compile-Time Error Generate करता है। क्योंकि OtherClass नाम की जो Class हमने इस Program में Create की है, वह Class, BaseClass की Derived Class नहीं है। जबकि हमने Generic Class के साथ Constraint के रूप में जो Base Class Specify की है, उस Base Class या उसकी Derived Class के अलावा हम किसी भी अन्‍य Class Type को इस Generic Class के साथ Parameter Type की तरह Specify नहीं कर सकते।

Generics in C# with Example
Generics Interface Constraint

******

ये पोस्‍ट 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 से छुटकारा पाएें।