Generics Interface 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 Interface Constraint: जब हम Constraint के रूप में किसी Interface को Specify करते हैं, तब ये जरूरी होता है कि जिस किसी भी Type को हम Parameter Type की तरह Specify करें, उसमें वह Interface Implemented हो। Interface Type भी Base Class Type की तरह ही हमें दो Important Purpose Provide करवाता है।

  • हम Interface Type के सभी Accessible Members को अपनी Generic Class में Use कर सकते हैं।
  • Interface Type C# Compiler को उस Type की Information देता है, जिसे Parameter Type की तरह Generic Class के साथ Use किया जा सकता है।

सरल शब्दों में कहें तो Interface Constraint Specify करने पर हम हर उस Type को Generic Class के लिए Parameter Type की तरह Use कर सकते हैं, जिसमें Interface को Implement किया गया है और Interface को जिस Type में Implement किया गया है, उस Type के सभी Accessible Members, Generic Class में भी Available रहते हैं।

यानी हम जिस Type को Parameter की तरह Specify करते हैं, उसमें वह Interface Constraint Implemented होना जरूरी होता है अथवा हम Constraint के रूप में Specified Interface को Generic Class के Parameter Type की तरह Use कर सकते हैं। Interface Type को भी हमें निम्नानुसार where Keyword के साथ Specify करना होता है:

	class GenericClassName<TYPE> where TYPE : Interface or InterfaceImplementedType 
	{ 
		// ...
	}

चूंकि C# में हम एक Class में एक से ज्यादा Interface को Implement कर सकते हैं, इसलिए जब हम किसी Generic Class के Parameter Type के लिए Interface Constraint Specify करते हैं, तो हम एक से ज्यादा Interfaces को Comma Separated List के रूप में Specify कर सकते हैं। इस Constraint को समझने के लिए भी हम निम्नानुसार एक Demo Program देख सकते हैं:

File Name: InterfaceConstraints.cs
using System;

namespace CSharpGenerics
{
    interface IDisplay
    {
        void Display();
    }

    class BaseClass : IDisplay
    {
        public void Display()
        {
            Console.WriteLine("IDisplay Implemented Base Class Method.");
        }

    }

    class OtherClass : IDisplay
    {
        public void Display()
        {
            Console.WriteLine("IDisplay Implemented OtherClass Method.");
        }
    }

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

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

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

    class InterfaceConstraints
    {
        static void Main()
        {
            BaseClass baseObject = new BaseClass();
            OtherClass otherObject = new OtherClass();

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

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

// Output:
   IDisplay Implemented Base Class Method.
   IDisplay Implemented OtherClass Method.

इस Program में हमने IDisplay नाम का एक Interface Create किया है, जिसमें Display() नाम के एक Method Declared है। फिर BaseClass OtherClass नाम की दो Normal Classes Define की हैं और दोनों में इस IDisplay Interface को Implement किया है। जबकि हमारी GenClass में हमने निम्नानुसार Constraint के रूप में IDisplay Interface को Specify किया है।

परिणामस्वरूप हम इस GenClass के आधार पर केवल उसी स्थिति में Constructed Type Create कर सकते हैं, जबकि हम इस Generic Class के Parameter Type के रूप में IDisplay Interface या IDisplay Interface को Implement करने वाले किसी Type को Use कर सकते हैं।

इस Program के Main() Method के Code में हमने किसी तरह का कोई Change नहीं किया है और ये Code Exactly पिछले Program की तरह ही है। इसलिए Main() Method Exactly पिछले Program की तरह ही Execute होता है।

जब ये Program Run होता है, तो निम्नानुसार Statements द्वारा सबसे पहले BaseClass व OtherClass Type का Object Create होता है:

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

फिर निम्नानुसार तरीके से GenClass Type का एक Generic Object Create करने के लिए Statement Specify किया जाता है:

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

चूंकि BaseClass में हमने IDisplay Interface को Implement किया है, इसलिए हम इस Generic Class में BaseClass को Parameter Type की तरह Specify कर सकते हैं। परिणामस्वरूप हमारा Generic Class इस BaseClass को Parameter की तरह Specify करने के कारण निम्नानुसार Define हो जाता है:

    class GenClass<BaseClass> 
    {
        BaseClass genObject;

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

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

इसलिए जब baseObject को इस Generic Class के GenClass<BaseClass>() Constructor में Pass किया जाता है, तो GenClass का Constructor Execute होकर BaseClass Type का genObject नाम का एक Object Create करता है और उसमें Main() Method में Declared baseObject का Reference Store कर देता है।

फलस्वरूप अब baseObject को genObject Reference द्वारा भी Access किया जा सकता है और baseObject के लिए हमें जिन Methods को Call करना है, उन्हें हम genObject के माध्‍यम से भी Call कर सकते हैं।

साथ ही GenClass Type का जो नया Object Create होता है, उसका Reference genBaseObject नाम के Reference Variable में Store हो जाता है। फिर निम्नानुसार अगला Statement Execute होता है:

genBaseObject.DisplayMessage();

जो genBaseObject के लिए Generic Class के DisplayMessage() Method को Invoke करता है, जो कि Internally BaseClass Type के genObject के लिए Display() Method Invoke करता है, जहां genObject में वास्तव में baseObject का Reference ही Stored है। परिणामस्वरूप Indirectly baseObject के लिए BaseClass का Display() Method Invoke हो जाता है और हमें निम्नानुसार Output Message प्राप्त होता है:

IDisplay Implemented Base Class Method.

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

GenClass<OtherClass> genOtherObject = new GenClass<OtherClass>(otherObject);

तो इस बार Generic Class में OtherClass को Parameter Type की तरह Specify किया गया है।

हम OtherClass को भी Parameter के रूप में इसलिए Specify कर सकते हैं, क्योंकि हमने OtherClass में भी IDisplay Interface को Implement किया है। परिणामस्वरूप हमारा Generic Class इस OtherClass को Parameter की तरह Specify करने के कारण इस बार निम्नानुसार Define हो जाता है:

    class GenClass<OtherClass> 
    {
        OtherClass genObject;

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

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

परिणामस्वरूप जब otherObject को इस Generic Class के GenClass<OtherClass>() Constructor में Pass किया जाता है, तो GenClass का Constructor Execute होकर OtherClass Type का genObject नाम का एक Object Create करता है और उसमें Main() Method में Declared otherObject का Reference Store कर देता है।

फलस्वरूप अब otherObject को genObject Reference द्वारा भी Access किया जा सकता है और otherObject के लिए हमें जिन Methods को Call करना हो, उन्हें हम genObject के माध्‍यम से भी Call कर सकते हैं। साथ ही GenClass Type का जो नया Object Create होता है, उसका Reference genOtherObject नाम के Reference Variable में Store हो जाता है। फिर निम्नानुसार अगला Statement Execute होता है:

genOtherObject.DisplayMessage();

जो genBaseObject के लिए Generic Class के DisplayMessage() Method को Invoke करता है जो कि Internally OtherClass Type के genObject के लिए Display() Method को Invoke करता है, जहां genObject में वास्तव में otherObject का Reference ही Stored है। परिणामस्वरूप Indirectly otherObject के लिए OtherClass का Display() Method Invoke हो जाता है और हमें निम्नानुसार Output Message प्राप्त होता है:

IDisplay Implemented Other Class Method.

हालांकि इस Program में हमने BaseClass OtherClass दोनों ही Classes में IDisplay Interface को Implement किया है, इसलिए दोनों ही Types को हम अपनी GenClass नाम की Generic Class के साथ Use कर सकते हैं। लेकिन यदि इन में से किसी भी Class में IDisplay Interface को Implement नही किया गया होताए तो ये Program भी हमें Compile Time Error Return करता।

इस Program में हमने Generic Type Define करते समय Interface Constraint के रूप में निम्नानुसार IDisplay Interface को Specify किया है:

class GenClass<T> where T : IDisplay

इसलिए हम हर उस Type को अपने GenClass का Constructed Type बनाने के लिए Parameter Type की तरह Specify कर सकते हैं, जिसमें IDisplay को Implement किया गया हो।

लेकिन यदि किसी Class में IDisplay Interface को Implement न किया गया हो बल्कि उसे किसी ऐसी Class से Derive किया गया हो, जिसमें IDisplay Implemented हो, तो हम उस Type को भी GenClass Generic Class के Parameter Type के रूप में Specify कर सकते हैं।

इस Concept को समझने के लिए हम हमारे पिछले Program को ही निम्नानुसार Modify कर सकते हैं, जहां हम OtherClass में IDisplay Interface को Implement नहीं कर रहे हैं, बल्कि इसे Base Class से Derive कर रहे हैं जबकि Base Class में IDisplay Interface Implemented है:

File Name: InterfaceConstraintDerivedClass.cs
using System;

namespace CSharpGenerics
{
    interface IDisplay { void Display(); }

    class BaseClass : IDisplay
    {
        virtual public void Display()
        {
            Console.WriteLine("IDisplay Implemented Base Class Method.");
        }
    }

    class OtherClass : BaseClass
    {
        override public void Display()
        {
            Console.WriteLine("IDisplay Implemented OtherClass Method.");
        }
    }

    class GenClass<T> where T : IDisplay
    {
      //Same as before
    }

    class InterfaceConstraints
    {
      //Same as before
    }
}

// Output:
   IDisplay Implemented Base Class Method.
   IDisplay Implemented OtherClass Method.

इस Program में हमने OtherClass को BaseClass से Derive किया है, जिसमें IDisplay Interface को Implement किया गया है। इसलिए जब हम इस बार इस Program को Run करते हैं, तो ये Program किसी तरह का Compile Time Error नहीं देताए क्योंकि हम GenClass नाम की  Generic Class के Parameter Type के रूप में उस Type को Specify कर सकते हैं, जिसमें अथवा जिसकी Parent Hierarchy की किसी भी Class में IDisplay Interface को Implement किया गया हो।

हालांकि BaseClass व OtherClass दोनों में ही Display() नाम का Method है, जिसका Signature दोनों ही Classes में समान है। इसलिए हम Display() Method को BaseClass में virtual Keyword के साथ Specify किया है, ताकि OtherClass में हम इसे override Keyword के साथ Specify करके Override कर सकें।

Generics Base Class Constraint
Constraint Types in C#

******

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