Illustrating difference between `override` and `new`

CSharp · Console

/Program.cs

using System;
					
public class Program
{
	public static void Main()
	{
		A a = new A();
		OverrideA overrideA = new OverrideA();
		NewA newA = new NewA();

		IShow iOverrideA = overrideA;
		IShow iNewA = newA;
		
		// Use the most concrete type
		a.ShowData(); // prints "This is Class A"
		overrideA.ShowData(); // prints "This is Class OverrideA"
		newA.ShowData(); // prints "This is Class NewA"
		
		// Use IShow type - key difference is here
		iOverrideA.ShowData(); // prints "This is Class OverrideA"
		iNewA.ShowData(); // prints "This is Class A"
	}
}

interface IShow
{
    public void ShowData();
}

class A : IShow
{
    public virtual void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class OverrideA : A
{
    public override void ShowData()
    {
        Console.WriteLine("This is Class OverrideA");
    }
}

class NewA : A
{
    public new void ShowData()
    {
        Console.WriteLine("This is Class NewA");
    }
}
;