Introduction

ููŠ ุงู„ู…ู‚ุงู„ ุฏู‡ุŒ ู‡ู†ุชูƒู„ู… ุนู† ุงู„ู€ Inheritance (ุงู„ูˆุฑุงุซุฉ) ููŠ ุงู„ุจุฑู…ุฌุฉ ุงู„ุดูŠุฆูŠุฉ (Object-Oriented Programming) ุจุงุณุชุฎุฏุงู… ู„ุบุฉ C# ู…ุน ุฃู…ุซู„ุฉ. ุงู„ู€ Inheritance ู‡ูˆ ูˆุงุญุฏ ู…ู† ู…ุจุงุฏุฆ ุงู„ู€ OOP. ูŠุง ุฑูŠุช ุชู‚ุฑุง ู…ู‚ุงู„ู†ุง ุนู† ุงู„ู€ Class ูˆุงู„ู€ Object ููŠ C# ู‚ุจู„ ู…ุง ุชูƒู…ู„ ู‡ู†ุง. ุฎู„ูˆู†ุง ู†ูู‡ู… ุฅูŠู‡ ู‡ูˆ ุงู„ู€ Inheritance.

What is Inheritance in C#?

ุงู„ู€ Inheritance ููŠ C# ู‡ูˆ ุขู„ูŠุฉ ู„ุงุณุชุฎุฏุงู… ุงู„ู€ members ุงู„ู„ูŠ ู…ุชุนุฑูุฉ ููŠ class ู…ุนูŠู† ู…ู† ุฎู„ุงู„ class ุชุงู†ูŠ. ุฅุญู†ุง ุนุงุฑููŠู† ุฅู† ุงู„ู€ class ู‡ูˆ ู…ุฌู…ูˆุนุฉ ู…ู† ุงู„ู€ members. ุงู„ู€ members ุงู„ู„ูŠ ู…ุชุนุฑูุฉ ููŠ class ู…ุนูŠู† ู…ู…ูƒู† class ุชุงู†ูŠ ูŠุณุชุฎุฏู…ู‡ุง ุนู† ุทุฑูŠู‚ ุฅู†ุดุงุก ุนู„ุงู‚ุฉ parent/child (ุฃุจ/ุงุจู†) ุจูŠู† ุงู„ู€ classes ุฏูŠ.

ุนู…ูˆู…ู‹ุงุŒ ูƒู„ู†ุง ุนุงุฑููŠู† ุฅู† ูƒู„ ู…ู…ุชู„ูƒุงุช ุฃู‡ู„ู†ุง ุจุชุจู‚ู‰ ุจุชุงุนุชู†ุง. ุงู„ุฃุจู†ุงุก ุจูŠุงุฎุฏูˆุง ุญู‚ูˆู‚ ุนู„ู‰ ู…ู…ุชู„ูƒุงุช ุงู„ุฃุจ. ู„ูŠู‡ุŸ ู„ุฅู† ุฏู‡ ุงู„ู‚ุงู†ูˆู†. ุญุณุจ ุงู„ู‚ุงู†ูˆู†ุŒ ูƒู„ ู…ู…ุชู„ูƒุงุช ุงู„ุฃู‡ู„ ุจุชุฑูˆุญ ู„ุฃูˆู„ุงุฏู‡ู….

ู†ูุณ ุงู„ู…ุจุฏุฃ ุฏู‡ ุจุงู„ุธุจุท ุจูŠุชุทุจู‚ ููŠ ุงู„ู€ Inheritance. ุงูุชุฑุถ ุฅู† ุนู†ุฏูŠ class ุงุณู…ู‡ A ููŠู‡ ู…ุฌู…ูˆุนุฉ membersุŒ ูˆุฃู†ุง ุนุงูŠุฒ ู†ูุณ ุงู„ู€ members ุฏูŠ ููŠ class ุชุงู†ูŠ ุงุณู…ู‡ B. ุทุฑูŠู‚ุฉ ู…ู† ุงู„ุทุฑู‚ ู‡ูŠ ุฅู†ูŠ ุฃุนู…ู„ copy ูˆpaste ู„ู†ูุณ ุงู„ูƒูˆุฏ ู…ู† class A ู„ู€ class B.

ู„ูƒู† ู„ูˆ ุนู…ู„ู†ุง copy ูˆpaste ู„ู„ูƒูˆุฏุŒ ูุฏู‡ ุจูŠุชุณู…ู‰ ุฅุนุงุฏุฉ ูƒุชุงุจุฉ ุงู„ูƒูˆุฏ (rewriting the code). ุฅุนุงุฏุฉ ูƒุชุงุจุฉ ุงู„ูƒูˆุฏ ุจุชุฃุซุฑ ุนู„ู‰ ุญุฌู… ุงู„ุชุทุจูŠู‚. ู„ูˆ ุญุฌู… ุงู„ุชุทุจูŠู‚ ุฒุงุฏุŒ ููŠ ุงู„ู†ู‡ุงูŠุฉ ุฏู‡ ู‡ูŠุฃุซุฑ ุนู„ู‰ ุฃุฏุงุก (performance) ุงู„ุชุทุจูŠู‚.

ุนุดุงู† ู†ุชุบู„ุจ ุนู„ู‰ ุนู…ู„ูŠุฉ ุฅุนุงุฏุฉ ุงู„ูƒุชุงุจุฉ ุฏูŠ ูˆู†ุนู…ู„ ุฅุนุงุฏุฉ ุงุณุชุฎุฏุงู… ู„ู„ูƒูˆุฏ (reuse the code)ุŒ ุฃูุถู„ ุฎูŠุงุฑ ู…ุชุงุญ ู„ูŠู†ุง ู‡ูˆ ุงู„ู€ Inheritance ููŠ C#. ุจุจุณุงุทุฉุŒ ุงู„ู„ูŠ ู…ุญุชุงุฌูŠู† ู†ุนู…ู„ู‡ ู‡ูˆ ุฅู†ู†ุง ู†ู†ุดุฆ ุนู„ุงู‚ุฉ ุจูŠู† ุงู„ุงุชู†ูŠู† classes. ุนู„ุงู‚ุฉ ุฅูŠู‡ุŸ ุนู„ุงู‚ุฉ Parent/Child. ุจู…ุฌุฑุฏ ู…ุง ุจุชู†ุดุฆ ุงู„ุนู„ุงู‚ุฉ ุฏูŠุŒ ูƒู„ ุงู„ู€ members ุจุชูˆุน ุงู„ู€ parent class (A) ู…ู…ูƒู† ุงุณุชุฎุฏุงู…ู‡ู… ุฌูˆู‡ ุงู„ู€ child class (B).

ุงู„ู€ Inheritance ููŠ C# ู‡ูˆ ุขู„ูŠุฉ ู„ุงุณุชุฎุฏุงู… ุงู„ู€ members ุจุชูˆุน class ููŠ class ุชุงู†ูŠ ุนู† ุทุฑูŠู‚ ุฅู†ุดุงุก ุนู„ุงู‚ุฉ parent/child ุจูŠู† ุงู„ู€ classesุŒ ูˆุฏู‡ ุจูŠูˆูุฑ ุฅุนุงุฏุฉ ุงู„ุงุณุชุฎุฏุงู… (re-usability).

How to Implement Inheritance in C#?

ุนุดุงู† ู†ุทุจู‚ ุงู„ู€ Inheritance ููŠ C#ุŒ ู…ุญุชุงุฌูŠู† ู†ู†ุดุฆ ุนู„ุงู‚ุฉ Parent/Child ุจูŠู† ุงู„ู€ classes. ุฎู„ูˆู†ุง ู†ูู‡ู… ุฅุฒุงูŠ ู†ุนู…ู„ ุฏู‡. ุงูุชุฑุถ ุฅู† ุนู†ุฏู†ุง class ุงุณู…ู‡ A ููŠู‡ ู…ุฌู…ูˆุนุฉ membersุŒ ูˆุนู†ุฏู†ุง class ุชุงู†ูŠ B ูˆุนุงูŠุฒูŠู†ู‡ ูŠูˆุฑุซ ู…ู† class A. ุงู„ูƒูˆุฏ ุงู„ุชุงู„ูŠ ุจูŠูˆุถุญ ุฅุฒุงูŠ ู†ู†ุดุฆ ุนู„ุงู‚ุฉ Parent-Child ุจูŠู† Class A ูˆ Class B.

class B : A
{
    // B is the child class, A is the parent class
}

ุฏูŠ ู‡ูŠ ุงู„ุนู…ู„ูŠุฉ ุงู„ุฃุณุงุณูŠุฉ ู„ุฅู†ุดุงุก ุนู„ุงู‚ุฉ Parent/Child ููŠ C#. ุฏู„ูˆู‚ุชูŠุŒ ุฎู„ูˆู†ุง ู†ุดูˆู ุงู„ู€ syntax ุงู„ุฃุณุงุณูŠ ู„ุฅู†ุดุงุก ุงู„ุนู„ุงู‚ุฉ ุฏูŠ:

[<modifiers>] class <child class> : <parent class>

ู‡ู†ุงุŒ ู…ุตุทู„ุญุงุช Parent Class ูˆ Child Class ู…ู…ูƒู† ุชุชุณู…ู‰ ุจุฑุถู‡ Base Class (Superclass) ูˆ Derived Class (Subclass). ูููŠ ู…ุซุงู„ู†ุง:

  • A โ‡’ Parent / Base / Superclass (ูƒู„ู‡ู… ุจู†ูุณ ุงู„ู…ุนู†ู‰).
  • B โ‡’ Child / Derived / Subclass (ูƒู„ู‡ู… ุจู†ูุณ ุงู„ู…ุนู†ู‰).

ู…ู„ุงุญุธุฉ: ููŠ ุงู„ู€ InheritanceุŒ ุงู„ู€ Child class ูŠู‚ุฏุฑ ูŠุณุชุฎุฏู… ุงู„ู€ members ุจุชูˆุน ุงู„ู€ Parent class ุจุชุงุนู‡ ูƒุฃู†ู‡ ู‡ูˆ ู…ุงู„ูƒ ุงู„ู€ members ุฏูŠ (ู…ุงุนุฏุง ุงู„ู€ private members ุจุชูˆุน ุงู„ู€ parent).

Why Child Cannot Consume Private Members of Parent?

ุนู…ูˆู…ู‹ุงุŒ ุงู„ุฃุจู†ุงุก ู„ูŠู‡ู… ุญู‚ูˆู‚ ููŠ ู…ู…ุชู„ูƒุงุช ุฃู‡ู„ู‡ู…. ุฃู†ุง ูƒุงุจู†ุŒ ุจูƒุฑุฉ ู…ู…ูƒู† ุฃุณุชู„ู… ุดุบู„ ุฃุจูˆูŠุง. ู…ู…ูƒู† ุฃุณุชู„ู… ู…ู…ุชู„ูƒุงุช ุฃุจูˆูŠุง (ุนุฑุจูŠุฉุŒ ู…ุจุงู†ูŠุŒ ูู„ูˆุณุŒ ุฃูŠ ุญุงุฌุฉ). ู„ูƒู† ู…ู‚ุฏุฑุด ุฃุณุชู„ู… ูˆุธูŠูุฉ ุฃุจูˆูŠุง.

ุงู„ุณุจุจ ู‡ูˆ ุฅู† ุงู„ูˆุธูŠูุฉ ุงู„ู„ูŠ ุฃุจูˆูŠุง ุจูŠุนู…ู„ู‡ุง ู…ู…ูƒู† ุชูƒูˆู† ู…ุจู†ูŠุฉ ุนู„ู‰ ู…ุคู‡ู„ุงุชู‡ ูˆุฎุจุฑุงุชู‡. ูˆุจูƒุฑุฉ ุฃู†ุง ู…ู‚ุฏุฑุด ุฃุณุชู„ู… ูˆุธูŠูุชู‡ ุฏูŠ ุชุญุฏูŠุฏู‹ุง. ูุงู„ูˆุธูŠูุฉ ุฏูŠ ุญุงุฌุฉ private ุชู…ุงู…ู‹ุง ู„ุฃุจูˆูŠุง. ูˆุฏูŠ ู…ุด ุจุชุชูˆุฑุซ ู„ูŠุง. ู„ูƒู† ุจุงู‚ูŠ ูƒู„ ุญุงุฌุฉุŒ ุงู„ุจูŠุฒู†ุณุŒ ุงู„ูู„ูˆุณุŒ ุงู„ู…ู…ุชู„ูƒุงุชุŒ ูƒู„ ุฏู‡ ู‡ุงุฎุฏู‡.

ู†ูุณ ุงู„ู…ุจุฏุฃ ุจูŠุชุทุจู‚ ุนู„ู‰ ุงู„ู€ Inheritance. ุงู„ู€ child class ุจูŠุณุชุฎุฏู… ูƒู„ ุงู„ู€ members ุจุชูˆุน ุงู„ู€ Parent class ู…ุงุนุฏุง ุงู„ู€ private members.

Example to Understand Inheritance in C#

ุฎู„ูˆู†ุง ู†ุดูˆู ู…ุซุงู„ ุจุณูŠุท ุนุดุงู† ู†ูู‡ู… ุงู„ู€ Inheritance ููŠ C#. ู‡ู†ุนู…ู„ class ููŠู‡ ุงุชู†ูŠู† methods ุฒูŠ ู…ุง ู…ูˆุถุญ ุชุญุช:

class A
{
    public void Method1()
    {
        Console.WriteLine("Method 1");
    }
    public void Method2()
    {
        Console.WriteLine("Method 2");
    }
}

ู‡ู†ุงุŒ ุนู…ู„ู†ุง class A ููŠู‡ ุงุชู†ูŠู† public methods: Method1 ูˆ Method2. ุฏู„ูˆู‚ุชูŠุŒ ุฃู†ุง ุนุงูŠุฒ ู†ูุณ ุงู„ุงุชู†ูŠู† methods ุฏูˆู„ ููŠ class ุชุงู†ูŠุŒ ูˆู„ูŠูƒู† class B. ุทุฑูŠู‚ุฉ ู…ู† ุงู„ุทุฑู‚ ู‡ูŠ ุฅู†ูŠ ุฃุนู…ู„ copy ู„ู„ุงุชู†ูŠู† methods ุงู„ู„ูŠ ููˆู‚ ูˆุฃุนู…ู„ู‡ู… paste ููŠ class B ูƒุงู„ุชุงู„ูŠ:

class B
{
    public void Method1()
    {
        Console.WriteLine("Method 1");
    }
    public void Method2()
    {
        Console.WriteLine("Method 2");
    }
}

ู„ูˆ ุนู…ู„ู†ุง ูƒุฏู‡ุŒ ูุฏู‡ ู…ุด ุฅุนุงุฏุฉ ุงุณุชุฎุฏุงู… ู„ู„ูƒูˆุฏ (code re-usability). ุฏู‡ ุฅุนุงุฏุฉ ูƒุชุงุจุฉ ู„ู„ูƒูˆุฏ (code rewriting) ูˆุฏู‡ ุจูŠุฃุซุฑ ุนู„ู‰ ุญุฌู… ุงู„ุชุทุจูŠู‚. ุนุดุงู† ูƒุฏู‡ุŒ ู…ู† ุบูŠุฑ ุฅุนุงุฏุฉ ูƒุชุงุจุฉุŒ ุงู„ู„ูŠ ู…ุญุชุงุฌูŠู† ู†ุนู…ู„ู‡ ู‡ูˆ inheritance ูƒุงู„ุชุงู„ูŠ. ู‡ู†ุงุŒ class B ุจูŠูˆุฑุซ ู…ู† class AุŒ ูˆุจุงู„ุชุงู„ูŠ ุฌูˆู‡ ุงู„ู€ Main methodุŒ ุจู†ุนู…ู„ instance ู…ู† class B ูˆุจู†ุณุชุฏุนูŠ ุงู„ู€ methods ุงู„ู„ูŠ ู…ุชุนุฑูุฉ ููŠ Class A.

class B : A
{
    static void Main()
    {
        B obj = new B();
        obj.Method1();
        obj.Method2();
    }
}

ุจู…ุฌุฑุฏ ู…ุง ุจุชุนู…ู„ InheritanceุŒ class B ูŠู‚ุฏุฑ ูŠุงุฎุฏ ุงู„ุงุชู†ูŠู† members ุงู„ู„ูŠ ู…ุชุนุฑููŠู† ููŠ class A. ู„ูŠู‡ุŸ ู„ุฅู† ูƒู„ ุฎุตุงุฆุต ุงู„ุฃุจ ุจุชู†ุชู…ูŠ ู„ู„ุฃุจู†ุงุก. ู‡ู†ุงุŒ class A ู‡ูˆ ุงู„ู€ Parent/Super/Base classุŒ ูˆClass B ู‡ูˆ ุงู„ู€ Child/Sub/Derived class.

ู„ู…ุง ุจู†ูƒุชุจ obj.ุŒ ู‡ุชู„ุงุญุธ ุฅู† ุงู„ู€ IntelliSense ุจูŠุธู‡ุฑ ุงู„ุงุชู†ูŠู† MethodsุŒ ุงู„ู„ูŠ ู‡ู…ุง Method1 ูˆ Method2. ุฏู‡ ู…ุนู†ุงู‡ ุฅู† ุงู„ู€ child class ูŠู‚ุฏุฑ ูŠุณุชุฎุฏู… ุงู„ู€ members ุจุชูˆุน ุงู„ู€ parent class ูƒุฃู†ู‡ ู‡ูˆ ุงู„ู…ุงู„ูƒ. ู„ูˆ ุจุตูŠุช ุนู„ู‰ ูˆุตู ุฃูŠ ู…ู† Method1 ุฃูˆ Method2ุŒ ู‡ุชู„ุงู‚ูŠู‡ ุจูŠุธู‡ุฑ void A.Method1() ูˆ void A.Method2(). ุฏู‡ ู…ุนู†ุงู‡ ุฅู† Method1 ุฃูˆ Method2 ุจูŠู†ุชู…ูˆุง ู„ู€ class A ุจุณ. ู„ูƒู† class B ูŠู‚ุฏุฑ ูŠุณุชุฎุฏู…ู‡ู… ูƒุฃู†ู‡ ุงู„ู…ุงู„ูƒ.

ู…ุซุงู„: ุฃู†ุง ุฃู‚ุฏุฑ ุฃุณูˆู‚ ุนุฑุจูŠุฉ ุฃุจูˆูŠุง ูƒุฃู†ูŠ ุฃู†ุง ู…ุงู„ูƒู‡ุงุŒ ู„ูƒู† ู„ุณู‡ ุงุณู… ุงู„ุชุณุฌูŠู„ ุจุงุณู… ุฃุจูˆูŠุง. ุจู†ูุณ ุงู„ุทุฑูŠู‚ุฉุŒ class B ูŠู‚ุฏุฑ ูŠู†ุงุฏูŠ ุงู„ู€ methods ูƒุฃู†ู‡ุง ุจุชุงุนุชู‡ุŒ ู„ูƒู† ุฏุงุฎู„ูŠู‹ุงุŒ ุงู„ู€ methods ุฏูŠ ุจุชู†ุชู…ูŠ ู„ู€ Class A.

ุงู„ูƒูˆุฏ ุงู„ูƒุงู…ู„ ู„ู„ู…ุซุงู„:

using System;
namespace InheritanceDemo
{
    class A
    {
        public void Method1()
        {
            Console.WriteLine("Method 1");
        }
        public void Method2()
        {
            Console.WriteLine("Method 2");
        }
    }
 
    class B : A
    {
        static void Main()
        {
            B obj = new B();
            obj.Method1();
            obj.Method2();
            Console.ReadKey();
        }
    }
}

Output:

Method 1
Method 2

ุฏู„ูˆู‚ุชูŠุŒ ุฎู„ูˆู†ุง ู†ุถูŠู method ุฌุฏูŠุฏุŒ ูˆู„ูŠูƒู† Method3 ููŠ Class B. ุฌูˆู‡ ุงู„ู€ Main methodุŒ ู„ูˆ ุดูุช ูˆุตู ุงู„ู€ methodุŒ ู‡ุชู„ุงู‚ูŠู‡ ุจูŠุธู‡ุฑ ุฅู† ุงู„ู€ method ุฏู‡ ุจูŠู†ุชู…ูŠ ู„ู€ class B.

using System;
namespace InheritanceDemo
{
    class A
    {
        public void Method1()
        {
            Console.WriteLine("Method 1");
        }
        public void Method2()
        {
            Console.WriteLine("Method 2");
        }
    }
 
    class B : A
    {
        public void Method3()
        {
            Console.WriteLine("Method 3");
        }
 
        static void Main()
        {
            B obj = new B();
            obj.Method1();
            obj.Method2();
            obj.Method3();
            Console.ReadKey();
        }
    }
}

Output:

Method 1
Method 2
Method 3

How many methods are there in class B?

ู…ู…ูƒู† ุชุณุฃู„ ู†ูุณูƒ: ูƒุงู… method ู…ูˆุฌูˆุฏ ููŠ class BุŸ ุงู„ุฅุฌุงุจุฉ ู‡ูŠ 3.

ุฒูŠ ู…ุง ูƒู„ ุงู„ู…ู…ุชู„ูƒุงุช ุงู„ู„ูŠ ุฃุจูˆูŠุง ุฃุฏุงู‡ุงู„ูŠุŒ ุฒุงุฆุฏ ูƒู„ ุงู„ู…ู…ุชู„ูƒุงุช ุงู„ู„ูŠ ุฃู†ุง ุจูƒุณุจู‡ุงุŒ ุจุชุจู‚ู‰ ุจุชุงุนุชูŠ ุฃู†ุง. ุจู†ูุณ ุงู„ุทุฑูŠู‚ุฉุŒ ุนุฏุฏ ุงู„ู€ methods ููŠ class B ู‡ูˆ 3: ุงุชู†ูŠู† methods ู…ูˆุฑูˆุซูŠู† ู…ู† ุงู„ู€ parent class A ุฒุงุฆุฏ ูˆุงุญุฏ method ุฅุญู†ุง ุนุฑูู†ุงู‡ ููŠ class B. ูุฅุญู†ุง ู†ู‚ุฏุฑ ู†ู‚ูˆู„ ุฅู† Class A ููŠู‡ 2 methodsุŒ ูˆClass B ููŠู‡ 3 methods.

ุฏูŠ ู‡ูŠ ุงู„ุนู…ู„ูŠุฉ ุงู„ุจุณูŠุทุฉ ู„ู„ู€ Inheritance ููŠ C#. ุจุจุณุงุทุฉ ุจุชุญุท ู†ู‚ุทุชูŠู† ููˆู‚ ุจุนุถ (:) ุจูŠู† ุงู„ู€ Parent ูˆุงู„ู€ Child class. ู„ูƒู† ู„ู…ุง ุจุชุดุชุบู„ ู…ุน InheritanceุŒ ููŠู‡ 6 ู‚ูˆุงุนุฏ ู…ู‡ู…ุฉ ู„ุงุฒู… ุชุชุนู„ู…ู‡ุง ูˆุชูุชูƒุฑู‡ุง. ุฎู„ูˆู†ุง ู†ุชุนู„ู…ู‡ู… ูˆุงุญุฏุฉ ูˆุงุญุฏุฉ.

Rule 1: Parent Constructor Accessibility

ููŠ C#ุŒ ู„ุงุฒู… ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ parent class ูŠูƒูˆู† ู…ุชุงุญ ุงู„ูˆุตูˆู„ ู„ูŠู‡ ู…ู† ุงู„ู€ child classุ› ูˆุฅู„ุงุŒ ุงู„ู€ inheritance ู…ุด ู‡ูŠุจู‚ู‰ ู…ู…ูƒู†. ุงู„ุณุจุจ ู‡ูˆ ุฅู†ู†ุง ู„ู…ุง ุจู†ุนู…ู„ object ู…ู† ุงู„ู€ child classุŒ ุฃูˆู„ ุญุงุฌุฉ ุจูŠุนู…ู„ู‡ุง ู‡ูŠ ุฅู†ู‡ ุจูŠุฑูˆุญ ูŠู†ุงุฏูŠ ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ parent class ุนุดุงู† ู…ุชุบูŠุฑุงุช ุงู„ู€ parent class ูŠุญุตู„ู‡ุง initialization ูˆู†ู‚ุฏุฑ ู†ุณุชุฎุฏู…ู‡ุง ุฌูˆู‡ ุงู„ู€ child class.

ููŠ ู…ุซุงู„ู†ุง ุงู„ุญุงู„ูŠุŒ class A ูˆ class B ุงู„ุงุชู†ูŠู† ุนู†ุฏู‡ู… implicit constructors. ุฃูŠ class ููŠ C# ุจูŠูƒูˆู† ููŠู‡ implicit constructor ู„ูˆ ุฅุญู†ุง ูƒู…ุทูˆุฑูŠู† ู…ุนุฑูู†ุงุด ุฃูŠ constructor ุจุดูƒู„ ุตุฑูŠุญ.

ู„ูˆ ุงู„ู€ constructor ู…ุชุนุฑู ุจุดูƒู„ implicitุŒ ูู‡ูˆ ุจูŠุจู‚ู‰ public. ููŠ ู…ุซุงู„ู†ุงุŒ class B ูŠู‚ุฏุฑ ูŠูˆุตู„ ู„ู„ู€ implicit constructor ุจุชุงุน class A ู„ุฃู†ู‡ public.

ุฏู„ูˆู‚ุชูŠุŒ ุฎู„ูˆู†ุง ู†ุนุฑู‘ู constructor ุตุฑูŠุญ ููŠ Class A:

class A
{
    public A()
    {
        Console.WriteLine("Class A Constructor is Called");
    }
    // ... methods
}

ู…ุน ุงู„ุชุบูŠูŠุฑ ุฏู‡ุŒ ู„ูˆ ุดุบู„ุช ุงู„ุชุทุจูŠู‚ุŒ ู‡ุชู„ุงู‚ูŠ ุงู„ู€ output ูƒุงู„ุชุงู„ูŠ:

Class A Constructor is Called
Method 1
Method 2

ุฏู‡ ู„ุฅู† ู„ู…ุง ุจูŠุชู… ุฅู†ุดุงุก instance ู…ู† ุงู„ู€ child classุŒ ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ child class ุจูŠู†ุงุฏูŠ ุจุดูƒู„ ุถู…ู†ูŠ (implicitly) ุนู„ู‰ ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ parent class ุจุชุงุนู‡. ุฏูŠ ู‚ุงุนุฏุฉ.

ู„ูƒู† ู„ูˆ ุฎู„ูŠุช ุงู„ู€ constructor ุจุชุงุน A ุจุฑุงูŠูุช privateุŒ ู‡ูŠุญุตู„ compile-time error ู„ุฃู† B ู…ุด ู‡ูŠู‚ุฏุฑ ูŠูˆุตู„ู‡.

class A
{
    A() // By default, this is private
    {
        Console.WriteLine("Class A Constructor is Called");
    }
    // ... methods
}

ุงู„ู€ Error ู‡ูŠูƒูˆู†: Class A Constructor is inaccessible due to its protection level.

ุฎู„ูˆู†ุง ู†ุนุฑู‘ู constructor ููŠ Class B ุจุฑุถู‡:

using System;
namespace InheritanceDemo
{
    class A
    {
        public A()
        {
            Console.WriteLine("Class A Constructor is Called");
        }
        // ... methods
    }
    class B : A
    {
        B()
        {
            Console.WriteLine("Class B Constructor is Called");
        }
        // ... Method3 and Main
    }
}

Output:

Class A Constructor is Called
Class B Constructor is Called
Method 1
Method 2
Method 3

ุฒูŠ ู…ุง ุดุงูŠู ููŠ ุงู„ู€ outputุŒ ุงู„ุฃูˆู„ ุงู„ู€ constructor ุจุชุงุน Class A ุจูŠุชู†ุงุฏู‰ุŒ ูˆุจุนุฏูŠู† ุงู„ู€ constructor ุจุชุงุน Class B. ุงู„ุชู†ููŠุฐ ุฏุงูŠู…ู‹ุง ุจูŠุจุฏุฃ ู…ู† ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ Parent class.

ุณุคุงู„: ู„ูŠู‡ ุงู„ู€ constructor ุจุชุงุน Class B ู…ุด publicุŸ ุงู„ู€ constructor ุจุชุงุน B ู…ุด ู…ุญุชุงุฌ ูŠูƒูˆู† public ุฅู„ุง ู„ูˆ ูƒุงู† ููŠู‡ class ุชุงู†ูŠ ุจูŠูˆุฑุซ ู…ู†ู‡. ุงู„ู€ constructor ุจุชุงุน A ู‡ูˆ ุงู„ู„ูŠ ู„ุงุฒู… ูŠูƒูˆู† ู…ุชุงุญ ู„ู€ B.

ุณุคุงู„: ู„ูŠู‡ ู„ุงุฒู… ุงู„ู€ parent constructor ูŠูƒูˆู† ู…ุชุงุญ ู„ู„ู€ childุŸ ู„ุฃู† ู„ู…ุง ุงู„ู€ parent constructor ุจูŠุชู†ุงุฏู‰ุŒ ุจูŠุญุตู„ initialization ู„ู„ู€ members ุจุชูˆุน ุงู„ู€ parentุŒ ูˆุจุนุฏู‡ุง ุจุณ ู†ู‚ุฏุฑ ู†ุณุชุฎุฏู…ู‡ู… ููŠ ุงู„ู€ child class. ู„ูˆ ุงู„ู€ members ุฏูˆู„ ู…ุญุตู„ู‡ู…ุด initializationุŒ ู…ุด ู‡ุชู‚ุฏุฑ ุชุณุชุฎุฏู…ู‡ู….

Rule 2: Parent Cannot Access Child Members

ููŠ ุงู„ู€ inheritanceุŒ ุงู„ู€ child class ูŠู‚ุฏุฑ ูŠูˆุตู„ ู„ู„ู€ members ุจุชูˆุน ุงู„ู€ parent classุŒ ู„ูƒู† ุงู„ู€ parent classes ุนู…ุฑู‡ุง ู…ุง ุชู‚ุฏุฑ ุชูˆุตู„ ู„ุฃูŠ members ู…ุชุนุฑูุฉ ุจุดูƒู„ ุฎุงู„ุต ููŠ ุงู„ู€ child class.

ุฒูŠ ุงู„ู‚ุงู†ูˆู†ุŒ ุงู„ุฃุจู†ุงุก ู„ูŠู‡ู… ุญู‚ูˆู‚ ููŠ ู…ู…ุชู„ูƒุงุช ุฃู‡ู„ู‡ู…ุŒ ู„ูƒู† ุงู„ุฃู‡ู„ ู…ุงู„ู‡ู…ุด ุญู‚ูˆู‚ ููŠ ู…ู…ุชู„ูƒุงุช ุฃุจู†ุงุฆู‡ู…. ุจู†ูุณ ุงู„ุทุฑูŠู‚ุฉุŒ ุงู„ู€ Parent class ุนู…ุฑู‡ ู…ุง ูŠู‚ุฏุฑ ูŠูˆุตู„ ู„ู„ู€ members ุจุชูˆุน ุงู„ู€ child class ุงู„ู„ูŠ ู…ุชุนุฑููŠู† ุฌูˆุงู‡ ุจุณ.

ุดูˆู ุงู„ูƒูˆุฏ ุฏู‡. ุฌูˆู‡ ุงู„ู€ Main methodุŒ ุจู†ุนู…ู„ instance ู…ู† ุงู„ู€ Parent class A ูˆุจู†ุญุงูˆู„ ู†ุณุชุฏุนูŠ Method3 ุงู„ู„ูŠ ู…ุชุนุฑู ููŠ Child class B. ู‡ูŠุญุตู„ compile-time error.

static void Main()
{
    A obj = new A();
    obj.Method1();
    obj.Method2();
    // The following line of code gives you compile time error
    obj.Method3(); 
    Console.ReadKey();
}

ุงู„ู€ Error ุจูŠู‚ูˆู„: class โ€˜Aโ€™ does not contain a definition for โ€˜Method3โ€™.

Rule 3: Parent Variable as a Reference to Child Instance

ู†ู‚ุฏุฑ ู†ุนู…ู„ initialize ู„ู…ุชุบูŠุฑ ู…ู† ู†ูˆุน ุงู„ู€ parent class ุจุงุณุชุฎุฏุงู… instance ู…ู† ุงู„ู€ child class ุนุดุงู† ู†ุฎู„ูŠู‡ reference variable. ุงู„ู€ reference ุฏู‡ ู‡ูŠุณุชู‡ู„ูƒ ุงู„ุฐุงูƒุฑุฉ ุจุชุงุนุฉ ุงู„ู€ child class instance. ู„ูƒู† ุญุชู‰ ููŠ ุงู„ุญุงู„ุฉ ุฏูŠุŒ ู…ู†ู‚ุฏุฑุด ู†ู†ุงุฏูŠ ุฃูŠ pure child class members ุจุงุณุชุฎุฏุงู… ุงู„ู€ reference ุฏู‡.

ุงู„ู€ Reference ู‡ูˆ ู…ุคุดุฑ ู„ู€ instance ูˆู…ุจูŠูƒูˆู†ุด ู„ูŠู‡ ุชุฎุตูŠุต ุฐุงูƒุฑุฉ ุฎุงุต ุจูŠู‡.

ู„ูˆ ุนู…ู„ู†ุง ูƒุฏู‡ุŒ ู‡ูŠุญุตู„ error ู„ุฅู† ุงู„ู…ุชุบูŠุฑ p ู…ุด ู…ุนู…ูˆู„ู‡ initialization:

A p; // p is an unassigned variable of class A
p.Method1(); // Compile Time Error: Use of unassigned local variable โ€˜pโ€™

ุนุดุงู† ู†ุนู…ู„ initializationุŒ ุจู†ุณุชุฎุฏู… ุงู„ู€ new keyword. ููŠ ุงู„ู…ุซุงู„ ุฏู‡ุŒ ุนู…ู„ู†ุง initialize ู„ู…ุชุบูŠุฑ p ุจุงุณุชุฎุฏุงู… instance ู…ู† B:

static void Main()
{
    A p; // p is a variable of class A
    B q = new B(); // q is an instance of Class B 
    
    // We can initialize a Parent class variable using child class instance
    p = q; // now, p is a reference to q's memory
    
    // Now you can call members of A class
    p.Method1();
    p.Method2();
    
    // We cannot call any pure child class members using the reference p
    // p.Method3(); // This would cause a compile-time error
    
    Console.ReadKey();
}

ู…ู„ุงุญุธุฉ: ุชุฎุตูŠุต ุงู„ุฐุงูƒุฑุฉ ุจูŠุชู… ู„ู„ู€ instancesุŒ ู…ุด ู„ู„ู€ references. ุงู„ู€ References ู…ุฌุฑุฏ ู…ุคุดุฑุงุช ู„ู„ู€ instances.

ุจุงู„ุฑุบู… ู…ู† ุฅู† p ูˆ q ุจูŠุดุงูˆุฑูˆุง ุนู„ู‰ ู†ูุณ ู…ูƒุงู† ุงู„ุฐุงูƒุฑุฉุŒ ุจุงุณุชุฎุฏุงู… pุŒ ู…ู‚ุฏุฑุด ุฃู†ุงุฏูŠ ุฃูŠ members ุฎุงุตุฉ ุจู€ class B. ู„ูƒู† ุจุงุณุชุฎุฏุงู… qุŒ ุฃู‚ุฏุฑ ุฃู†ุงุฏูŠ ุงู„ู€ members ุจุชูˆุน A ูˆ B ุงู„ุงุชู†ูŠู†.

Rule 4: The Default Parent Class is Object

ูƒู„ class ุณูˆุงุก ุฅุญู†ุง ุงู„ู„ูŠ ู…ุนุฑููŠู†ู‡ ุฃูˆ ู…ุชุนุฑู ู…ุณุจู‚ู‹ุง ููŠ ู…ูƒุชุจุงุช ุงู„ู„ุบุฉุŒ ู„ูŠู‡ parent class ุงูุชุฑุงุถูŠุŒ ูˆู‡ูˆ Object class ุงู„ู„ูŠ ู…ูˆุฌูˆุฏ ููŠ ุงู„ู€ System namespace. ุนุดุงู† ูƒุฏู‡ุŒ ุงู„ู€ members ุจุชูˆุน ุงู„ู€ Object class (Equals, GetHashCode, GetType, ToString) ู…ุชุงุญูŠู† ููŠ ุฃูŠ ู…ูƒุงู†.

ู„ู…ุง ุจุชุนุฑู classุŒ ุญุชู‰ ู„ูˆ ู…ุนู…ู„ุชุด inheritance ู…ู† ุฃูŠ class ุชุงู†ูŠุŒ ุงู„ู€ compiler ุจูŠุฎู„ูŠู‡ ูŠูˆุฑุซ ู…ู† Object class ุชู„ู‚ุงุฆูŠู‹ุง.

ููŠ ู…ุซุงู„ู†ุงุŒ class A ุจูŠูˆุฑุซ ู…ู† Object. ูˆ class B ุจูŠูˆุฑุซ ู…ู† A. ุฏู‡ ู…ุนู†ุงู‡ ุฅู† Object ูŠุนุชุจุฑ grandparent ู„ู€ class B.

ุฅูŠู‡ ู‡ูˆ ุงู„ู€ Default Parent Class ููŠ C#ุŸ ู‡ูˆ Object class ุงู„ู„ูŠ ู…ูˆุฌูˆุฏ ููŠ System namespace.

ุงู„ู…ุซุงู„ ุฏู‡ ุจูŠูˆุถุญ ุฅุฒุงูŠ GetType() ุจุชุฑุฌุน ุงู„ู€ runtime type ุจุชุงุน ูƒู„ instance:

static void Main()
{
    Object obj1 = new Object();
    Console.WriteLine($"obj1 type: {obj1.GetType()}");
 
    A obj2 = new A();
    Console.WriteLine($"obj2 type: {obj2.GetType()}");
 
    B obj3 = new B();
    Console.WriteLine($"obj3 type: {obj3.GetType()}");
 
    Console.ReadKey();
}

Output:

obj1 type: System.Object
Class A Constructor is Called
obj2 type: InheritanceDemo.A
Class A Constructor is Called
Class B Constructor is Called
obj3 type: InheritanceDemo.B

Rule 5: No Multiple Inheritance with Classes

ููŠ C#ุŒ ู…ููŠุด ุฏุนู… ู„ู„ู€ multiple inheritance (ุงู„ูˆุฑุงุซุฉ ุงู„ู…ุชุนุฏุฏุฉ) ุนู† ุทุฑูŠู‚ ุงู„ู€ classes. ุงู„ู„ูŠ ู…ุชุงุญ ู„ูŠู†ุง ู‡ูˆ Single Inheritance ุจุณ. ุฏู‡ ู…ุนู†ุงู‡ ุฅู† ุงู„ู€ class ู…ุณู…ูˆุญู„ู‡ ูŠูƒูˆู† ุนู†ุฏู‡ parent class ู…ุจุงุดุฑ ูˆุงุญุฏ ุจุณ.

ูŠุนู†ูŠ (Single, Multilevel, Hierarchical) ู…ุฏุนูˆู…ูŠู†ุŒ ู„ูƒู† (Multiple, Hybrid) ู…ุด ู…ุฏุนูˆู…ูŠู†.

Rule 6: Handling Parameterized Parent Constructors

ููŠ Rule1ุŒ ุนุฑูู†ุง ุฅู† ุงู„ู€ child constructor ุจูŠู†ุงุฏูŠ ุถู…ู†ูŠู‹ุง ุนู„ู‰ ุงู„ู€ parent constructorุŒ ุจุณ ุฏู‡ ู„ูˆ ูƒุงู† parameterless (ู…ุจูŠุงุฎุฏุด parameters).

ู„ูˆ ุงู„ู€ constructor ุจุชุงุน ุงู„ู€ Parent class ูƒุงู† parameterizedุŒ ุงู„ู€ Child class constructor ู…ุด ู‡ูŠู‚ุฏุฑ ูŠู†ุงุฏูŠู‡ ุถู…ู†ูŠู‹ุง. ุนุดุงู† ู†ุญู„ ุงู„ู…ุดูƒู„ุฉ ุฏูŠุŒ ู…ุณุคูˆู„ูŠุฉ ุงู„ู…ุจุฑู…ุฌ ุฅู†ู‡ ูŠู†ุงุฏูŠ ุจุดูƒู„ ุตุฑูŠุญ (explicitly) ุนู„ู‰ ุงู„ู€ Parent constructor ู…ู† ุงู„ู€ child constructor ูˆูŠุจุนุชู„ู‡ ู‚ูŠู… ู„ู„ู€ parameters. ุนุดุงู† ู†ุนู…ู„ ูƒุฏู‡ุŒ ุจู†ุณุชุฎุฏู… ุงู„ู€ base keyword.

ู„ูˆ ุฎู„ูŠู†ุง ุงู„ู€ constructor ุจุชุงุน A ูŠุงุฎุฏ parameterุŒ ู‡ูŠุญุตู„ error ููŠ B:

class A
{
    public A(int number) // Parameterized constructor
    {
        Console.WriteLine($"Class A Constructor is Called : {number}");
    }
}
 
class B : A
{
    public B() // Error here!
    {
        Console.WriteLine("Class B Constructor is Called");
    }
}

ุงู„ู€ Error ุจูŠู‚ูˆู„: There is no argument given that corresponds to the required formal parameter โ€˜numberโ€™ of โ€˜A.A(int)โ€™. ุงู„ู€ constructor ุจุชุงุน B ู…ุด ุนุงุฑู ูŠุจุนุช ู‚ูŠู…ุฉ ุฅูŠู‡ ู„ู„ู€ constructor ุจุชุงุน A.

ุงู„ุญู„ ู‡ูˆ ุฅู†ู†ุง ู†ุณุชุฎุฏู… base ุนุดุงู† ู†ุจุนุช ุงู„ู‚ูŠู…ุฉ ุจุดูƒู„ ุตุฑูŠุญ:

public B() : base(10) // Explicitly call parent constructor with value 10
{
    Console.WriteLine("Class B Constructor is Called");
}

ุงู„ูƒูˆุฏ ุงู„ูƒุงู…ู„:

using System;
namespace InheritanceDemo
{
    class A
    {
        public A(int number)
        {
            Console.WriteLine($"Class A Constructor is Called : {number}");
        }
    }
    class B : A
    {
        public B() : base(10)
        {
            Console.WriteLine("Class B Constructor is Called");
        }
        static void Main()
        {
            B obj = new B();
            Console.ReadKey();
        }
    }
}

Output:

Class A Constructor is Called : 10
Class B Constructor is Called

How to pass dynamic value to Parent class constructor in C#?

ู…ู…ูƒู† ูƒู…ุงู† ู†ุจุนุช ู‚ูŠู…ุฉ ุฏูŠู†ุงู…ูŠูƒูŠุฉ ู…ู† Main ู„ู€ B ูˆู…ู† B ู„ู€ A:

class B : A
{
    // Take a parameter in the child constructor
    public B(int num) : base(num) // Pass it to the parent constructor
    {
        Console.WriteLine("Class B Constructor is Called");
    }
 
    static void Main()
    {
        B obj1 = new B(10);
        B obj2 = new B(20);
        B obj3 = new B(30);
        Console.ReadKey();
    }
}

Output:

Class A Constructor is Called : 10
Class B Constructor is Called
Class A Constructor is Called : 20
Class B Constructor is Called
Class A Constructor is Called : 30
Class B Constructor is Called

ุฏูŠ ู‡ูŠ ุงู„ุณุช ู‚ูˆุงุนุฏ ุงู„ู„ูŠ ุงู„ู…ูุฑูˆุถ ุชูุชูƒุฑู‡ุง ูˆุฅู†ุช ุดุบุงู„ ู…ุน ุงู„ู€ Inheritance ููŠ C#.

Advantages of Inheritance in C#

  • Code reusability (ุฅุนุงุฏุฉ ุงุณุชุฎุฏุงู… ุงู„ูƒูˆุฏ): ุจู†ู‚ุฏุฑ ู†ุนูŠุฏ ุงุณุชุฎุฏุงู… ุงู„ู€ members ุจุชูˆุน ุงู„ู€ parent class ููŠ ุงู„ู€ child class. ูู…ุด ู…ุญุชุงุฌูŠู† ู†ุนูŠุฏ ุชุนุฑูŠู ุงู„ู€ members ุชุงู†ูŠ ููŠ ุงู„ู€ child class. ูˆุฏู‡ ุจูŠู‚ู„ู„ ุงู„ูƒูˆุฏ ุงู„ู…ุทู„ูˆุจ ููŠ ุงู„ู€ class.