Saturday 14 January 2017

Virtual vs Overriding vs New keyword in c#?

Virtual and Overriding keyword are used for method overriding. Method overriding is concept of Polymorphism. New keyword is used for method hiding.
Now we check how to use this keyword in c# by example.

Example 1:-

namespace ConsoleProg
{
    class A
    {
        public void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public void show()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public void show()
        {
            Console.WriteLine("C");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B
            C c = new C();
            c.show(); // print-- C

            A a1 = new B();
            a1.show(); // print-- A
        }
    }
}
Note:- But it show some warning message.

1.) 'ConsoleProg.B.show()' hides inherited member 'ConsoleProg.A.show()'. Use the new keyword if hiding was intended.
 2.) ‘ConsoleProg.C.show()' hides inherited member 'ConsoleProg.B.show()'. Use the new keyword if hiding was intended.  
Solution of the above warning is use either new keyword or overriding keyword in derived class in method.

Virtual And Overriding keyword (Method overriding):-

If you want to be method overriding in the derived class, then the base class method must have the virtual keyword otherwise it will throw an error.

Example 2:-

namespace ConsoleProg
{
    class A
    {
        public virtual void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public override void show()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public override void show()
        {
            Console.WriteLine("C");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B
            C c = new C();
            c.show(); // print-- C

            A a1 = new B();
            a1.show(); // print-- B
        }
    }
}

New Keyword (Method hiding):

New keyword is used for method hiding the base class method from derived class.

Example 3:-

namespace ConsoleProg
{
    class A
    {
        public void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public new void show()
        {
            Console.WriteLine("B");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B

            A a1 = new B();
            a1.show(); // print-- B
        }
    }
}

Method Overriding and Hiding:-

Example 4:-

 namespace ConsoleProg
{
    class A
    {
        public  void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public new virtual void show()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public override void show()
        {
            Console.WriteLine("C");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B
            C c = new C();
            c.show(); // print-- C

            A a1 = new B();
            a1.show(); // print-- A

            B b2 = new C();
            b2.show();  // print-- C

            A a2 = new C();
            a2.show();// print-- A
        }
    }
}

Example 5:

namespace ConsoleProg
{
    class A
    {
        public virtual void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public override void show()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public override void show()
        {
            Console.WriteLine("C");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B
            C c = new C();
            c.show(); // print-- C

            A a1 = new B();
            a1.show(); // print-- A

            B b2 = new C();
            b2.show();// print-- C

            A a2 = new C();
            a2.show();// print-- C
        }
    }
}
Example 6:
namespace ConsoleProg
{
    class A
    {
        public virtual void show()
        {
            Console.WriteLine("A");
        }
    }
    class B : A
    {
        public override void show()
        {
            Console.WriteLine("B");
        }
    }
    class C : B
    {
        public new void show()
        {
            Console.WriteLine("C");
        }
    }
    class Program
    {
        static void Main()
        {
            A a = new A();
            a.show();   // print-- A
            B b = new B();
            b.show();  // print-- B
            C c = new C();
            c.show(); // print-- C

            A a1 = new B();
            a1.show(); // print-- A

            B b2 = new C();
            b2.show(); // print-- B

            A a2 = new C();
            a2.show(); // print-- B
        }
    }
}

Important Point:

Override:-
      1.) Use this keyword polymorphism implementation along with virtual.  
      2.) With same name and parameter as in base class.
      3.) It is call called as run time polymorphism.
      4.) Also called as late binding.

New :-
     1.) It is used in polymorphism concept.
     2.) With same name and different parameters.  
     3.) Compile time bindig.
     4.) Also called early binding.