Curiousdev
Curiousdev

Reputation: 5788

Inheritance in c# and object creation in c#

I have classes as follow one is SuperClass which is inherited by ChildClass and Child1Class ScreenShot

public class SuperClass
{
    public new int Superclassprop = 2;
    public virtual void play()
    {
        Console.WriteLine("SuperClass");
    }

}

public class ChildClass : SuperClass
{
    public new int Childclassprop = 2;

    public override void play()
    {
        Console.WriteLine("ChildClass");
    }

}
public class Child1Class : SuperClass
{
    public new int Childclassprop = 3;

    public override void play()
    {
        Console.WriteLine("Child1Class");
    }
}

Now when i create an object something like below i don't understand what is the difference between these. i had read a huge bunch of blogs related to this but i didn't find any justifiable answer please help me to understand what actually is happening here or suggest me a good blog or article including on SO where i can understand a whole concept behind this why we need this where the actual real time use of these concept?

SuperClass obj = new SuperClass();
SuperClass obj1 = new ChildClass();

I have attached screenshot of watch which is generating on Run-Time why there is a obj1 consisting all properties but i can access only SuperClassprop?

Thanks in advance any help will be really appreciated.

Upvotes: 1

Views: 915

Answers (2)

Jaimin Dave
Jaimin Dave

Reputation: 1222

Here is the more practical example of your topic:

using System;

 public class Music
    {
        public virtual string play()
        {
            return "Play Music";
        }
    }

    public class Drum : Music
    {
        public override string play()
        {
            return "Play Drums";
        }
    }

    public class Piano : Music
    {
        public override string play()
        {
            return "Play Piano";
        }
    }

    public class PlayMusicService
    {
        private readonly Music _musicContext;
        public PlayMusicService(Music musicContext)
        {
            this._musicContext = musicContext;
        }

        public string PlayAlbum()
        {
            return _musicContext.play();
        }        
    }


public class Program
{
    public static void Main()
    {
         string whatPlayed = "";

        Drum drums = new Drum();        
        PlayMusicService music1 = new PlayMusicService(new Drum());     
        whatPlayed = music1.PlayAlbum();
        Console.WriteLine(whatPlayed);

        Piano piano = new Piano();
        PlayMusicService music2 = new PlayMusicService(new Piano());
        whatPlayed = music2.PlayAlbum();
        Console.WriteLine(whatPlayed);
    }
}

Output: Play Drums Play Piano

Upvotes: 4

Mong Zhu
Mong Zhu

Reputation: 23732

i don't understand what is the difference between these.

One of the main differences is the constructor call

SuperClass obj = new SuperClass();
SuperClass obj1 = new ChildClass();

In the case of obj1 the ChildClass constructor is called after the SuperClass constructor and the field and property initialisation is done also for the property Childclassprop

consisting all properties but i can access only SuperClassprop?

The variable obj1 is still of type SuperClassprop so at compile time you are only allowed to see and use those variables that belong to this class. If you want to actually access the variables of ChildClass you will have to cast it to the proper type:

var r = (obj1 as ChildClass).Childclassproput;

why we need this where the actual real time use of these concept?

One scenario that comes to my mind is : it might be that at compile time it is not clear which class has to be instantiated. But this is decided at runtime. But you need already a variable to write the call of the specific play() method. At runtime it will be decided which method is called in the end.

SuperClass obj = new SuperClass();

bool condition = false;
if (condition)
{
    obj = new ChildClass();
}
else
{
    obj = new ChildClass1();
}

// now just call the method and the proper method will be called
obj.play();

Upvotes: 3

Related Questions