Inheritance 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

Inheritance in C#: पिछले Chapter में हमने किसी Real World Object को Computer Program में Logically Represent करने के लिए एक Simple Class Design करने से सम्बंधित विभिन्न Concepts जैसे कि Constructors, Fields, Properties, Methods, Constants, Read-Only Fields, Static Members आदि के बारे में जाना।

Class Design करने के बाद Object Oriented Programming System के दो अन्‍य मूल Concepts Inheritance Polymorphism होते हैं, जिनके बारे में हम इस Chapter में समझेंगे। इन दोनों Concepts का मूल उद्देश्‍य C# Program में Code Reusability की सुविधा प्राप्त करना होता है।

चूंकि किसी भी Application Software में बहुत सारी ऐसी Functionalities होती हैं, जो कि विभिन्न प्रकार के Applications के लिए समान होती है। Object Oriented Programming System का Inheritance Concept हमें इसी तरह के Common Codes को Reuse करने की सुविधा Provide करता है, ताकि किसी विषय से सम्बंधित Common Features Related Functionalities को प्राप्त करने के लिए Common Codes को एक बार एक Class के रूप में Create व Debug कर लेने के बाद उस Code Snippet को फिर से देखने की जरूरत न रहे।

जबकि यदि नई Functionality प्राप्त करने के लिए उसी Class को Extend करना हो, तो Inheritance Concept का प्रयोग करते हुए उस Class के आधार पर एक नई Derived Class बनाई जा सके, जिसमें पहले से बने हुए Code ज्यों का त्यों काम करें, जबकि नए Codes Create होने वाली नई Class में नई Functionalities को Provide कर सकें।

Inheritance के Concept का प्रयोग करते हुए हम सामान्‍यत: किसी Real World Object की Common Functionalities या General Functionalities के लिए एक मुख्‍य Class Design कर लेते हैं, जिसे Base Class, Parent Class या Super Class कहा जाता है। जबकि इस Parent Class में नई Functionalities को Add करने के लिए हम इस Parent Class को एक नई Class में Derive या Inherit कर लेते हैं, जिसे Derived Class, Child Class या Sub-Class कहते हैं।

साथ ही सभी प्रकार की नई Functionalities प्राप्त करने के लिए हम इस Derived Class में Base Class के Codes को Reuse करते हुए नए Codes लिख लेते हैं, जबकि नए Codes लिखने के लिए हमें Base Class के Codes को किसी भी तरह से फिर से Modify करने की जरूरत नहीं होती।

Code Reusability प्राप्त करने के लिए हम सामान्‍यत: दो तरीके Use कर सकते हैं। पहले तरीके के अन्तर्गत OOPS के Inheritance Concept को Use किया जाता है और जब हम Inheritance Concept Use करते हैं, तब Parent Class व Child Class के बीच “is-a” Relationship होती है।

जबकि दूसरे तरीके के अन्तर्गत Containment या Composition Model को Use किया जाता है, जिसमें किसी एक Class के अन्दर किसी दूसरी Class का Object, Data Member की तरह Define किया जाता है। इस तरह के Model को Use करने पर दो Classes के बीच “has-a” Relationship बनती है।

जब हम Inheritance Use करते हैं, तब हम वास्तव में Child Class को Base Class पर Depend कर रहे होते हैं। Inheritance का मूल विचार ये है कि एक नई Child Class को किसी पहले से बनी हुई Base Class के Existing Code के आधार पर Create किया जाता है।

Class Inheritance in C#

Class Inheritance के अन्तर्गत हम हमारी जरूरत के अनुसार एक नई Class Define करते हैं, जिसके स्वयं के Data Members Methods तो होते ही हैं, साथ ही उसमें उस Base Class के Data Members व Methods भी होते हैं, जिससे उसे Derive किया गया होता है।

Derived Class Define करने के लिए हमें नई Create की जाने वाली Derived Class के Declaration के बाद उस Base Class को Specify करना होता है, जिसके Features को हम ज्यों का त्यों Reuse करने के लिए Derived Class में प्राप्त करना चाहते हैं, जबकि दोनों Classes के नाम के बीच एक Colon Specify करना होता है।

Derived Class हमेंशा अपनी Base Class को Extend करता है, क्योंकि Derived Class के स्वयं के Members तो होते ही हैं, साथ ही उसमें उसकी Base Class के भी Members होते हैं। हालांकि एक Derived Class अपनी Base Class के Members को Access तो कर सकता है, लेकिन कभी भी अपनी Base Class के किसी भी Member को Delete नहीं कर सकता। Inheritance Concept के Implementation को हम निम्न Code के अनुसार समझ सकते हैं:

Inheritance in C# Super Class - Sub Class - Hindi

Inheritance in C# Super Class – Sub Class – Hindi

इस Code में SomeClass एक Base Class है, जिसके Members को OtherClass नाम की नई Create होने वाली Derived Class में Inherit किया जा रहा है। इस Code के Execution को निम्न चित्रानुसार समझा जा सकता है:

Inheritance in C# Super Class - Sub Class Representation - Hindi

Inheritance in C# Super Class – Sub Class Representation – Hindi

जैसाकि इस चित्र द्वारा हम समझ सकते हैं कि SomeClass में एक Field व एक ही Method है। लेकिन जब इसके आधार पर OtherClass को Derive किया जाता है, तब इस Derived Class में स्वयं का एक Field व एक Method तो होता ही है, साथ ही SomeClass का Field Method भी होता है। इस तरह से OtherClass में बिना Define किए हुए SomeClass के Field Method को भी Derive करके प्राप्त कर लिया जाता है।

जब हम कोई Derived Class Define करते हैं, तब सभी Inherited Members को हम उसी तरह से Access व Manipulate कर सकते हैं, जैसे कि उन्हें Derived Class में ही Define किया गया हो। इसे समझने के लिए हम एक उदाहरण Program देखते हैं जो कि निम्नानुसार है:

File Name: InheritanceBasics.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;
        }

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

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

        public void SetTime(byte hour, byte minute, byte second)
        {
            //this.hour = hour;	Error: Cannot Access Private Property Directly
            //this.minute = minute; 	Error: Cannot Access Private Property Directly
            SetTime(hour, minute);
            this.second = second;
        }

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

    class UsingTime
    {
        static void Main(String[] arg)
        {

            Console.WriteLine("Base Time Class");
            Time hmt = new Time();
            hmt.SetTime(12, 22);
            Console.Write("Time of HMT: ");
            hmt.DisplayTime();

            Console.WriteLine("\n\nDerived Time Class");
            NewTime sonata = new NewTime();
            sonata.SetTime(10, 15, 30);
            Console.Write("Time of SONATA: ");
            sonata.DisplayNewTime();
        }
    }
}

// Output:
   Base Time Class
   Time of HMT: 12:22

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

इस Program में Time नाम की Class Base Class है, जिसमें hourminute नाम की दो Properties हैं और SetTime()Display() Time नाम के दो Methods हैं, जो कि Time Type के Object के hourminute को Set व Display करने का काम करते हैं। जबकि NewTime नाम की Class second नाम का केवल एक Data Member है।

लेकिन चूंकि हमने NewTime Class को Time Class से Derive किया है, इसलिए NewTime Class में Time Class के hourminute Data Members Base Class के SetTime()DisplayTime() नाम के Public Methods के माध्‍यम से Available हो जाते हैं।

चूंकि किसी भी समय में केवल Second नहीं हो सकताए बल्कि हर समय Hour, Minute व Second का Combination होता है, इसलिए NewTime Class पूरी तरह से Time Class पर Depend है। क्योंकि NewTime Class अपने Hour व Minute के Data को Base Class में ही Store करता है।

Base Class की तरह ही हमने Derived Class में भी SetTime() नाम का एक Method बनाया है, जो कि NewTime Time के Object के Data को Display करने के लिए पहले Base Class में Defined SetTime() Method को Call करता है, फिर Current Class की second Property का मान Display कर देता है।

चूंकि Base Class व Derived Class दोनों ही Classes में SetTime() नाम का Method Define किया गया है, लेकिन चूंकि दोनों ही Classes के SetTime() Method के Signature में अन्तर है, इसलिए जब हम दो Parameters Pass करके SetTime() Method को Call करते हैं, तो Base Class का SetTime() Method Invoke होता है, जबकि तीन Arguments Pass करके SetTime() Method को Call करने पर Derived Class का SetTime() Method Invoke होता है।

जब इस Program को Run किया जाता है, तो C# Compiler सबसे पहले निम्नानुसार Statement को Execute करके Time Class जो कि हमारे उदाहरण में हमारी Base Class है, का एक Object Create करता है:

Time hmt = new Time();

और फिर उस Newly Created Time Object को निम्न Statement द्वारा Time Set करता है:

hmt.SetTime(12, 22);

चूंकि हमने hmt को Base Class Type का Create किया है साथ ही SetTime() Method को दो ही Parameters Pass किए हैं, इसलिए इस Statement के Execute होने पर Base Class में Defined SetTime() Method ही Execute होता है और hmt के Hour व Minute को निम्नानुसार Code Execute करके Set कर देता है:

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

जबकि अन्त में निम्न Statement को Execute करके Time Type के hmt Object के hourminute Property के Data को Display कर देता है:

hmt.DisplayTime();

अब C# Compiler निम्न Statement Execute करके NewTime Type का एक नया Object sonata Create करता है:

NewTime sonata = new NewTime();

और इस sonata Object को hour, minuteseconds का मान Set करने के लिए निम्नानुसार SetTime() Method को Call करता है:

sonata.SetTime(10, 15, 30);

चूंकि sonata Object NewTime Class का Object है, इसलिए इस Object के लिए जब हम SetTime() Method को Call करते हैं, तो NewTime Class में Defined SetTime() Method ही Call होता है और ये Method दो नहीं बल्कि तीन Parameters Accept करता है।

लेकिन NewTime Class में हमने केवल second नाम की एक ही Property को Specify किया है, इसलिए hourminute के Data को NewTime Class में Store करने के लिए कोई Space Allocate नहीं होता। बल्कि NewTime Class के SetTime() Method के निम्नानुसार Code द्वारा ये Data, Base Class के hour minute को Pass कर दिए जाते हैं:

        public void SetTime(byte hour, byte minute, byte second)
        {
            //this.hour = hour;	Error: Cannot Access Private Property Directly
            //this.minute = minute; 	Error: Cannot Access Private Property Directly
            SetTime(hour, minute);
            this.second = second;
        }

जैसाकि इस Method के Code द्वारा हम समझ सकते हैं कि चूंकि NewTime Class को Time Class से Derive किया गया है, इसलिए hour minute के Data को Store करने के लिए Base Class ही hour minute नाम की Properties Create करता है और इन Base Class की Properties में Data को Store करने के लिए ही हमने Base Class के SetTime() Method को निम्नानुसार hour minute Parameters Pass करते हुए Call किया है:

SetTime(hour, minute);

चूंकि Derived Class के लिए Base Class के सभी Public Members, Directly Available होते हैं, इसलिए NewTime Class में SetTime() Method को Call करने के लिए हमें Base Class का Object Create करने की जरूरत नहीं होती। इसीलिए हमने उपरोक्त Statement के अनुसार Derived Class में Base Class के Method को Directly Call किया है। इस Code में हमने निम्नानुसार दो Lines के Code को Comment बनाया है:

//this.hour = hour;         Error: Cannot Access Private Property Directly
//this.minute = minute;        Error: Cannot Access Private Property Directly

चूंकि Base Class के सभी Members, Derived Class में Directly Accessible नहीं होने चाहिए, ताकि Derived Class Create करते समय हम किसी भी तरह से Base Class के Predefined व Precompiled Debugged Code को Modify न कर सकें, यानी Base Class का Data पूरी तरह से External Access से सुरिक्षत रहे, इसके लिए Base Class के Data को Private Access में रखा जाता है, क्योंकि Base Class के Private Data को Derived Class का Object भी Directly Access नहीं कर सकता।

इसीलिए यदि हम उपरोक्त Comment को Normal Statement बना दें, तो C# Compiler NewTime नाम की Derived Class में ही hour minute Property को Search करने लगेगा क्योंकि this हमेंशा Current Object को ही Represent करता है और क्योंकि इन्हें Derived Class में Define ही नहीं किया गया है, इसलिए इन Comment Statements को Normal Statements में Convert करने पर इन Statements को Execute करते समय C# Compiler Error Return करेगा। लेकिन यदि हम उपरोक्त Comments को निम्नानुसार Specify करते हुए SetTime() Method को Modify कर दें:

        public void SetTime(byte h, byte m, byte s)
        {
            //hour = h;		Error: Cannot Access Private Property Directly
            //minute = m; 	Error: Cannot Access Private Property Directly
            SetTime(h, m);
            this.second = s;
        }

और इस Method में Defined दोनों Comments को Normal Statement बना दें, जिसमें this का प्रयोग न किया गया हो, तो जब NewTime Class के Object sonata के लिए SetTime() Method को Call किया जाएगा, तब C# Compiler hour minute को Current Class में Search करेगा।

चूंकि इन Properties को NewTime नाम की Derived Class में Define नहीं किया गया है, इसलिए C# Compiler को ये Properties Current Class में प्राप्त नहीं होंगी। परिणामस्वरूप C# Compiler इन Properties को NewTime Class की Parent Class में Search करेगा।

लेकिन Derived Class में कभी भी Base Class के Private Members Derive नहीं होते क्योंकि Base Class के सभी Private Members किसी भी अन्‍य Class से Direct Access से Restricted रहते हैं या किसी भी अन्‍य (External or Derived) Class के लिए Invisible रहते हैं, इसलिए Time नाम की Base Class में hour minute नाम की Properties Exist होने के बावजूद C# Compiler इन्हें Access नहीं कर सकेगा। परिणामस्वरूप Result के रूप में Error Return होगा।

इसीलिए Parent Class के hour minute Properties में Data Pass करने के लिए हम Base Class के SetTime() Method को Use करते हैं। हालांकि Derived Class व Base Class दोनों में ही SetTime() नाम का Method Exist है, लेकिन दोनों का Signature अलग होने की वजह से हम Derived Class के SetTime() में Base Class के SetTime() Method को Call करते हुए उसे Reuse कर सकते हैं, जैसाकि उपरोक्त SetTime() Method के Code में किया गया है।

जब समान Class में समान नाम व अलग-अलग Signature के एक से ज्यादा Methods को Define किया जाता है, तो इस प्रक्रिया को Method Overloading कहा जाता है। लेकिन जब Base Class में Defined Method के समान नाम व अलग-अलग Signature का Method Derived Class में Define किया जाता है, तो इस प्रक्रिया को Method Overriding कहा जाता है, क्योंकि इस स्थिति में Derived Class का Method समान नाम के Base Class के Method को Override करता है।

हालांकि इस Program में हमने SetTime() नाम के Method को Override किया है, लेकिन हम दोनों Classes में DisplayTime() नाम का Method Define करके DisplayTime() Method को Override नहीं कर सकते, क्योंकि दोनों ही Classes के DisplayTime() Method के नाम के साथ ही Method का Signature भी एक समान ही है और हम एक समान Signature वाले एक से ज्यादा Method न तो समान Class में Define कर सकते हैं, न ही Derived Class में और यदि हम ऐसा करते हैं, तो Compiler Confuse हो जाता है। परिणामस्वरूप Error Return करता है। कैसे\

C# Compiler किसी भी Member की Searching सबसे पहले Current Scope में ही करता है। यानी यदि हम Derived Class में किसी Method को Call करने के लिए Specify करें, तो C# Compiler सबसे पहले उस नाम व Signature के Method को Current Class में ही Search करेगा और यदि उस नाम व Signature का Method Current Scope में Exist नहीं होगा, तो उसी नाम व Signature के Method को Parent Class या Base Class के Scope में Search करेगा।

मानलो कि हमने NewTime ClassTime Class दोनों ही Classes में DisplayTime() नाम का Method Define किया है, जिनका Signature भी समान है। लेकिन जैसाकि हम जानते हैं कि Derived Class में केवल second का Data ही Store हो रहा है, जबकि hourminute का Data तो Base Class में Store हो रहा है, इसलिए Derived Class का DisplayTime() Method तो केवल second के Data को ही Display कर सकता है।

परिणामस्वरूप Base Class के hourminute के Data को Display करने के लिए Base Class के DisplayTime() Method को Derived Class के DisplayTime() Method में Call करना होगा। क्योंकि Base Class की hourminute Properties Private होने के कारण Derived Class में Directly Accessible नहीं हैं। इसलिए हम Derived Class में भी DisplayTime() नाम का Method Create करें, तो हमारा Method कुछ निम्नानुसार होगा:

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

लेकिन यदि हम Derived Class में इस तरह का DisplayTime() Method Define करते हुए DisplayTime() Method को Override करें, तो इस स्थिति में यदि हम Base Class Time के Object hmt के लिए DisplayTime() Method को Call करेंगे, तब तो बिना किसी परेशानी के C# Compiler, Time Class के DisplayTime() Method को Execute करते हुए hmt के hourminute के Data को Display कर देगा।

लेकिन जब हम NewTime नाम की Derived Class के Object sonata के लिए DisplayTime() नाम के Method को Use करेंगे, तो sonata Object, NewTime Class का Object होने की वजह से C# Compiler DisplayTime() नाम के Method को सबसे पहले NewTime Class में ही Search करेगा।

क्योंकि हम उपरोक्तानुसार Code द्वारा पहले ही समान Signature के DisplayTime() Method को Derived Class में Defined कर चुके हैं, इसलिए Searching के दौरान C# Compiler को समान Class में ही DisplayTime() नाम Method प्राप्त हो जाएगा।

परिणामस्वरूप C# Compiler कभी भी Base Class के DisplayTime() Method को Call नहीं करेगा और एक प्रकार से Recursion की स्थिति पैदा हो जाएगी। यानी DisplayTime() नाम का Method फिर से स्वयं को ही Call करेगा और Continually बार-बार Call करता रहेगा।

इस तरह की परिस्थिति पैदा न हो, इसीलिए हमने Derived Class में DisplayTime() नाम के Method के स्थान पर निम्नानुसार DisplayNewTime() नाम का Method Define किया है:

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

ये Method Internally Base Class के DisplayTime() Method को Call करता है। Derived Class में हमने DisplayTime() नाम का Method ही Define नहीं किया है। यानी जब NewTime Class के sonata Object के लिए DisplayNewTime() Method को Call किया जाता है, तो ये Method hour minute का Data प्राप्त करने के लिए Internally DisplayTime() Method को Call करता है।

परिणामस्वरूप सबसे पहले C# NewTime Class में ही DisplayTime() Method को Search करता है। लेकिन चूंकि NewTime Class में इस Method को Define नहीं किया गया है, इसलिए C# Compiler इस नाम के Method को Time Class में Search करता है, जहां उसे समान नाम व Signature का Method प्राप्त हो जाता है और NewTime Class के Object sonata का Time hour, minuteseconds के साथ Display हो जाता है।

जैसाकि हमने पहले बताया कि जब हम Inheritance का प्रयोग करते हैं, तब हम वास्तव में Parent Class व Child Class के बीच एक “is-a” Relationship Establish कर रहे होते हैं। इसलिए यदि हम अपने Current उदाहरण के आधार पर इस Relationship को Represent करें, तो हम कह सकते हैं कि “NewTime is a Time” यानी NewTime Type स्वयं एक Time Type है।

.NET Framework की सभी Classes मूल रूप से object नाम की एक Class से Derived होती हैं, भले ही उन्हें Base Class की तरह ही क्यों न Define किया जा रहा हो। यानी हमारे पिछले उदाहरण की Time नाम की Base Class भी वास्तव में .NET Framework की object Class से Inherit होने वाली Derived Class ही है। जबकि केवल object नाम की .NET Class ही सभी अन्‍य Classes की Base Class है क्योंकि इसे किसी भी अन्‍य Class द्वारा Derive नहीं किया जाता। इसलिए object Class वास्तव में Inheritance Hierarchy की मुख्‍य Base Class है।

जब हम स्वयं Time Class जैसी Base Class Create करते हैं, तब हम वास्तव में Class-Base Specification को Specify नहीं करते, बल्कि ये Specification Implicitly Derive होती है। यानी वास्तव में यदि हम देखें, तो हमारी Time Class का Actual Definition निम्नानुसार होता है:

    class Time : object
    {
        public byte hour { set; get; }
        public byte minute { set; get; }

        public void SetTime(byte hour, byte minute)
        . . .
    }

Class Inheritance के अन्तर्गत जब हम केवल एक ही Parent Class से एक Derive Class बनाते हैं, तो इस प्रक्रिया को Single Inheritance कहा जाता है। जबकि यदि हम Derive की गई Class को फिर से Derive कर लें, तो बनने वाले Inheritance को Multi-Level Inheritance कहते हैं।

इसी तरह से यदि एक से ज्यादा Base Classes को Derive करते हुए एक नई Class बनाई जाए, तो बनने वाली Class Multiple-Inheritance को Represent करता है और एक Base Class से कई Classes Derive करने पर Perform होने वाला Inheritance Hierarchical Inheritance कहलाता है। जबकि यदि हम Single, Multiple, Multi-Level आदि को Mix करते हुए एक नई Class Derive करें, तो इस तरह के Inheritance को Hybrid Inheritance के नाम से जाना जाता है।

Base Class व Derived Class एक दूसरे से सम्बंधित शब्द हैं। C# में सभी Classes Derived Class ही होती हैं, फिर भले ही वह Class किसी अन्‍य Class से Derive हो या object नाम की Top Level Class से। जबकि केवल object नाम की Class ही Base Class होती है।

Pointers in C#
Inheritance in C# with Example

******

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