-3

I have a code

using System;

namespace ExploreOOP
{
    class Program
    {
        static void Main(string[] args)
        {    
            Base1 b1 = new Derived1();
            Derived1 d1 = new Derived1();
            b1.write();
            d1.write();

            Console.WriteLine();
            Console.WriteLine();


            Base2 b2 = new Derived2();
            Derived2 d2 = new Derived2();
            b2.write();
            d2.write();


            Console.WriteLine();
            Console.WriteLine();

            Base3 b3 = new Derived3();
            Derived3 d3 = new Derived3();
            b3.write();
            d3.write();

            Console.ReadKey();

        }
    }

    public class Base1
    {
        public void write()
        {
            Console.WriteLine("Inside Base1 class");
        }
    }

    public class Derived1 : Base1
    {
        public void write()
        {
            Console.WriteLine("Inside Derived1 class");
        }
    }

    public class Base2
    {
        public virtual void write()
        {
            Console.WriteLine("Inside Base2 class");
        }
    }

    public class Derived2 : Base2
    {
        public override void write()
        {
            Console.WriteLine("Inside Derived2 class");
        }
    }

    public class Base3
    {
        public void write()
        {
            Console.WriteLine("Inside Base3 class");
        }
    }

    public class Derived3 : Base3
    {
        new public void write()
        {
            Console.WriteLine("Inside Derived3 class");
        }
    }

}

and it outputs,

Inside Base1 class
Inside Derived1 class


Inside Derived2 class
Inside Derived2 class


Inside Base3 class
Inside Derived3 class

So my question is,

public class Base1
{
    public void write()
    {
        Console.WriteLine("Inside Base1 class");
    }
}

public class Derived1 : Base1
{
    public void write()
    {
        Console.WriteLine("Inside Derived1 class");
    }
}

and

public class Base3
{
    public void write()
    {
        Console.WriteLine("Inside Base3 class");
    }
}

public class Derived3 : Base3
{
    new public void write()
    {
        Console.WriteLine("Inside Derived3 class");
    }
}

does the same thing?

Noor A Shuvo
  • 2,639
  • 3
  • 23
  • 48

1 Answers1

2

From the C# reference on the new modifier:

When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. When you hide an inherited member, the derived version of the member replaces the base class version. Although you can hide members without using the new modifier, you get a compiler warning. If you use new to explicitly hide a member, it suppresses this warning.

This means that yes, Derived3 and Derived1 are essentially the same, except the first case will output a warning, specifically

warning CS0108: 'Derived1.write()' hides inherited member 'Base1.write()'. Use the new keyword if hiding was intended.  
Mor A.
  • 3,805
  • 2
  • 16
  • 19