C# Virtual Method

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

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

BUY NOW DOWNLOAD READ ONLINE

C# Virtual Method: पिछले Program में हमने देखा कि हम Derived Class के Object के Base Class Part को Casting करके Base Class के Reference द्वारा Point कर सकते हैं और इस Newly Created Reference द्वारा Derived Class के Base Part के Members को Modify भी कर सकते हैं।

Virtual Method हमें ऐसी सुविधा Provide करता है कि हम Base Class के Reference द्वारा Derived Class के Members को भी Access करने की क्षमता प्राप्त कर लेते हैं। यानी यदि हम चाहें तो किसी Base Class Reference द्वारा किसी Derived Class के Method को भी Call कर सकते हैं और हम ऐसा निम्न परिस्थितियों में कर सकते हैं, जब:

  • Derived Class व Base Class दोनों में ही समान Signature Return Type का Method हो।
  • Base Class में Defined Method के साथ virtual Keyword Associated हो।
  • Derived Class में Defined Method के साथ override Keyword Associated हो।

इन Rules के आधार पर यदि हम हमारे Time Class के Example को फिर से Recreate करें, तो हमारा Program कुछ निम्नानुसार बन सकता है:

// File Name: VirtualAndOverrideMethods.cs
using System;

namespace CSharpInterface
{
    class Time
    {
        public byte hour { set; get; }
        public byte minute { set; get; }

        public void SetTime(byte hour, byte minute)
        {
            this.hour = hour;
            this.minute = minute;
        }

        virtual public void DisplayTime()
        {
            Console.Write(hour + ":" + minute);
        }
    }

    class NewTime : Time
    {
        public byte second { set; get; }

        public void SetTime(byte hour, byte minute, byte second)
        {
            SetTime(hour, minute);
            this.second = second;
        }

        override public void DisplayTime()
        {
            base.DisplayTime();
            Console.Write(":" + second);
        }
    }

    class UsingTime
    {
        static void Main(String[] arg)
        {
            Console.WriteLine("\nDerived Time Class");
            NewTime sonata = new NewTime();
            sonata.SetTime(10, 15, 30);
            Console.Write("Time of SONATA: ");
            sonata.DisplayTime();

            Console.WriteLine("\n\nBase Time Class");
            Time hmt = (Time)sonata;
            Console.Write("Time of HMT: ");
            hmt.DisplayTime();
        }
    }
}

// Output:
   Derived Time Class
   Time of SONATA: 10:15:30

   Base Time Class
   Time of HMT: 10:15:30

इस Program में और पिछले Program में केवल इतना ही अन्तर है कि इस Program में हमने DisplayTime() Method के साथ Base Class में virtual व Derived Class में override Keywords का प्रयोग किया है, जबकि पिछले Program में हमने DisplayTime() Method की Masking की थी। लेकिन दोनों ही Programs के Output में काफी अन्तर है।

पिछले Program में Base Class का Reference, Derived Class के Object के Base Class Part को ही Reference कर रहा था और Base Class के Data को Display करने के लिए Base Class के ही DisplayTime() Method को Call कर रहा था।

जबकि इस Program में Base Class का Reference, Derived Class के Object के Base Class Part को तो Reference कर रहा है, लेकिन Base Class के Data को Display करने के लिए भी Derived Class के ही DisplayTime() Method को Call कर रहा था। यही वजह है कि दोनों ही Output समान Result Return कर रहे हैं।

इस तरह से हम समझ सकते हैं कि virtual override Keywords को Use करते हुए हम Derived Class के Object के आधार पर Created Base Class Reference द्वारा भी Derived Class के Methods को Call कर सकते हैं।

virtualoverride Modifiers को Use करते समय हमें इस बात का ध्‍यान रखना होता है कि Overriding (virtual) व Overridden (override) दोनों Methods की Accessibility समान होनी चाहिए। यानी यदि दोनों में से एक public व दूसरा private Access Mode में हो, तो उपरोक्त Code काम नहीं करेगा।

साथ ही हम किसी Static Method अथवा ऐसे Method को Override नहीं कर सकते, जिसके साथ Base Class में virtual Keyword को Use नहीं किया गया है। हम Methods, Properties, Indexers Event Types को virtual override Keywords का प्रयोग करते हुए Override करते हुए भी उपरोक्त Functionality प्राप्त कर सकते हैं, क्योंकि Internally तो ये भी Methods ही होते हैं। अन्तर केवल इतना है कि ये Special Methods होते हैं।

चूंकि C# में Multi-Level Hierarchy सम्भव है, इसलिए कभी-कभी ऐसी स्थिति बन जाती है कि किसी Class A को किसी दूसरी Class B में Derive किया जाता है और फिर उस दूसरी Class B को तीसरी Class C में Derive किया जाता है।

इस प्रकार की Inheritance Hierarchy होने पर यदि Base Class Reference किसी Derived Object के Base Class Part को Refer करता है, तो Base Class Reference जब किसी Derived Class के किसी Overridden Method को Call करता है, तो उस Call को पूरा करने के लिए C# Derivation Hierarchy में अन्तिम Level की Derived Class तक उस Overridden Method को Invoke करने के लिए Search करता है।

यानी यदि हम Class A का Reference Create करें, तो ये Reference Class B व Class C में भी Overridden Method को Execute करने के लिए Search करेगा। यदि Overridden Method, Class B में Exist होगा, तो भी C# Compiler इस Method को Class C में भी Search करेगा और Class C में Overridden Method के Exist होने पर उसे ही Execute करेगा, भले ही Class B में भी वही Method Exist क्यों न हो।

लेकिन यदि Overridden Method, Class B में तो Exist हो, मगर Class C में Exist न हो, तो C# Compiler, Class B के Overridden Method को Invoke करेगा। जबकि यदि Class C में Defined Method override Keyword के साथ Specify न किया गया हो, तो वह Method Invoke नहीं होगा।

जिस तरह से हम Methods को Override करने के लिए virtual override Keyword Combination का प्रयोग करते हैं, ठीक उसी तरह से हम Properties, Events Indexers को भी Override कर सकते हैं, क्योंकि Internally ये तीनों भी Methods ही होते हैं, लेकिन ये थोडा अलग तरह के Methods होते हैं।

जब हम किसी Property, Event या Indexer को Base Class में virtual Keyword के साथ Specify करते हैं, तो Derived Class में उसी Property, Event या Indexer को override Keyword के साथ Specify करना जरूरी होता है।

साथ ही जब हम Property, Event या Indexer को Override करते हैं और Base Class के Reference द्वारा Derived Class के Object के Base Class Part को Point करते हैं, तो Base Class के Reference के माध्‍यम से Derived Class की Property, Event या Indexer को ठीक उसी तरह से Call किया जा सकता है, जिस तरह से पिछले उदाहरण में DisplayTime() Method को Override किया है।

Constructor Execution

पिछले Chapter में हमने Constructors के बारे में Detail से जाना था कि किस तरह से हम Constructors का प्रयोग करके Newly Create होने वाले Object को Initial Values से Initialize कर सकते हैं। साथ ही हमने ये भी देखा था कि किस तरह से हम Constructors का प्रयोग करके हम Static Member व Class के Instance Member दोनों को Initialize कर सकते हैं।

जबकि इस Chapter में हमने अभी तक जाना कि किस तरह से हम किसी Base Class को Derive करके उसकी Functionalities को एक नई Class में Inherit कर सकते हैं और किस तरह से Derived Class के Object के अन्दर ही उसकी Base Class का भी Object Inbuilt होता है।

हालांकि Derived Class में Base Class के सभी Members Inherit होते हैं, लेकिन Base Class में Define किया गया कोई भी Constructor Derived Class में Inherit नहीं होता। बल्कि जब हम किसी Derived Class का Object Create करते हैं, तो Inheritance Hierarchy की सभी Classes में Defined Constructors Execute होने से पहले अपनी Base Class के Constructor को सबसे पहले Execute करते हैं। इस बात को समझने के लिए हम निम्नानुसार Code Segment को उदाहरण के रूप में Use कर सकते हैं:

class MyDerivedClass : MyBaseClass
{
	MyDerivedClass(){};	//Constructor executes Base Class Constructor MyBaseClass() first.
	. . .
}

जब ये Code Run होता है और हम MyDerivedClass का Object Create करते हैं, तो सबसे पहले Create होने वाले नए Object के सभी Instance Members Initialize होते हैं। जब सभी Instance Members Initialize हो जाते हैं, उसके बाद Derived Class का Constructor पहले Execute नहीं होताए बल्कि Derived Class का Constructor पहले अपने Base Class के Constructor को Execute करता है और जब Base Class का Constructor पूरी तरह से Execute हो चुका होता है, तब Derived Class का Constructor Execute होना शु: होता है। इस प्रक्रिया को हम निम्न चित्र द्वारा आसानी से Represent कर सकते हैं:

Constructor Call Chain को समझने के लिए हम निम्नानुसार एक उदाहरण Program Create कर सकते हैं, ताकि हम इस बात को निश्चित कर सकें, कि Derived Class का Object Create होने पर सबसे पहले Inheritance Hierarchy की Top Level Base Class का Constructor Call होता है और सबसे अन्त में Current Class का Constructor Call होता है, जिसका Object Create किया जा रहा होता है:

// File Name: ConstructorChaining.cs
using System;

namespace CSharpInterface
{
    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Base Class Constructor Called. ");
        }
    }

    class DerivedClassLevel1 : BaseClass
    {
        public DerivedClassLevel1()
        {
            Console.WriteLine("Derived Class Level1 Constructor Called. ");
        }
    }

    class DerivedClassLevel2 : DerivedClassLevel1
    {
        public DerivedClassLevel2()
        {
            Console.WriteLine("Derived Class Level2 Constructor Called. ");
        }
    }

    class UsingBaseClass
    {
        static void Main(String[] arg)
        {
            Console.WriteLine("Base Class Object Creating...");
            BaseClass objBase = new BaseClass();

            Console.WriteLine("\nDerived Class Level1 Object Creating...");
            DerivedClassLevel1 objDL1 = new DerivedClassLevel1();

            Console.WriteLine("\nDerived Class Level2 Class Object Creating...");
            DerivedClassLevel2 objDL2 = new DerivedClassLevel2();
        }
    }
}

// Output:
   Base Class Object Creating...
   Base Class Constructor Called. 

   Derived Class Level1 Object Creating...
   Base Class Constructor Called. 
   Derived Class Level1 Constructor Called. 

   Derived Class Level2 Class Object Creating...
   Base Class Constructor Called. 
   Derived Class Level1 Constructor Called. 
   Derived Class Level2 Constructor Called.

इस Program में हमने तीन Level का Multi-Level Inheritance Hierarchy Define किया है और जैसाकि इस Program के Output द्वारा हम समझ सकते हैं कि जब Base Class का Object Create होता है, तो केवल Base Class का ही Constructor Execute होता हैं।

लेकिन जब हम Derived Class का Object Create करते हैं, तब भी Inheritance Hierarchy की Top Level Base Class का Constructor सबसे पहले Execute होता है और क्रम से सभी Derived Classes का Constructor Execute होने के बाद अन्त में उस Class का Constructor Execute होता है, जिसका Object Create किया जा रहा है।

जब हम Constructors Define करते हैं, तब हमें हमेंशा इस बात का विशेष ध्‍यान रखना चाहिए कि हम कभी भी किसी Constructor Body में किसी Virtual Method को Call न करें। यदि हम ऐसा करते हैं तो हम चाहे किसी भी Derived Class का Object क्यों न करें, सबसे पहले Base Class का Constructor ही Execute होता है और इस Constructor के Execute होते ही उसमें Specified Virtual Method Execute हो जाता है और Derived Class के Override Method को Invoke कर देता है।

लेकिन जब तक Constructor Execute न हो जाए, तब तक कोई भी अन्‍य Method Execute नहीं होना चाहिए, क्योंकि Constructor किसी भी Object के लिए Execute होने वाला सबसे पहला Method होता है और जब हम किसी Constructor में Virtual Method को Call करते हैं, तो Object का Constructor Execute होने से पहले ही Virtual Method Execute हो जाता है, जो कि नहीं होना चाहिए।

Constructor Initializers

जब हम किसी Class या Derived Class में कोई Constructor Define नहीं करते, तब उस Class का Object Create करने के लिए Automatically No-Argument या No-Parameter Constructor Execute होता है, जिसे Default Constructor कहते हैं।

लेकिन जैसाकि हमने पिछले Chapter में देखा था कि Constructor भी एक प्रकार के Method ही होते हैं, इसलिए जिस तरह से Methods की Overloading होती है, उसी तरह से Constructors की भी Overloading की जा सकती है।

इसलिए यदि हम चाहते हैं कि हमारा कोई Derived Class, Default Constructor को छोडकर किसी अन्‍य Specific Base Class Constructor को Use करे, तो इस जरूरत को पूरा करने के लिए हमें Constructor Initializers का प्रयोग करना पडता है। Constructor Initializers को मूलत: दो तरीकों से Specify किया जा सकता है:

  • पहले तरीके में हमें base Keyword का प्रयोग करना होता है और उस Constructor के अनुसार Parameters को Specify करना होता है, जिसे हम Derived Class में Call करना चाहते हैं।
  • जबकि दूसरे तरीके में हम this Keyword का प्रयोग करते हैं और उस Constructor के अनुसार Parameters को Specify करते हैं, जिसे हम Derived Class में Call करना चाहते हैं।

निम्नानुसार Code Segment द्वारा हम दोनों ही तरीकों से Base Class Constructors को Use करने के विषय में आसानी से समझ सकते हैं:

class MyDerivedClass : MyBaseClass
{
	MyDerivedClass() : base()
	{
		. . .
	};	
	. . .
}

जैसाकि उपरोक्त Code Segment द्वारा हम समझ सकते हैं कि MyDerivedClass नाम की Class का Constructor वास्तव में MyBaseClass के Default Constructor को Derived Class में Call कर रहा है।

चूंकि Base Class का Default Constructor, Derived Class में Implicitly Specify हो जाता है, इसलिए यदि हम चाहें, तो उपरोक्त Code Segment को निम्नानुसार भी लिख सकते हैं:

class MyDerivedClass : MyBaseClass
{
	MyDerivedClass()
	{
		. . .
	};	
	. . .
}

जबकि this का प्रयोग करते हुए Base Class के Appropriate Constructor को Invoke करने के विषय में हम पुस्तक के Using this with Constructors Section में Detail से Discuss कर चुके हैं।

फिर भी यदि हम चाहें, तो अपनी जरूरत के अनुसार किसी Derived Class में किसी Base Class Constructor को Call करने के लिए अपने पिछले Code Segment को ही this Keyword का प्रयोग करते हुए ही निम्नानुसार भी लिख सकते हैं:

class MyDerivedClass : MyBaseClass
{
	MyDerivedClass() : this()
	{
		. . .
	};	
	. . .
}

ये Code Segment ठीक पिछले वाले Code Segment की तरह ही MyDerivedClass में MyBaseClass के Default Constructor को Call करेगा।

Polymorphism in C#
C# Access Modifiers

******

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