public static void Main()
IClass face = (IClass) new SuperClass();
Console.WriteLine("## Calling thru interface");
SuperClass instance = new SuperClass();
Console.WriteLine("Calling thru instance");
instance.NonVirtualMethod();
instance.VirtualMethod();
SubClass subClass = new SuperClass();
Console.WriteLine("Calling thru subclass");
subClass.NonVirtualMethod();
subClass.VirtualMethod();
public class SubClass : IClass
public void NonVirtualMethod()
Console.WriteLine("SubClass - NonVirtualMethod");
public virtual void VirtualMethod()
Console.WriteLine("SubClass - VirtualMethod");
public class SuperClass : SubClass, IClass
public new void NonVirtualMethod()
Console.WriteLine("SuperClass - NonVirtualMethod");
public override void VirtualMethod()
Console.WriteLine("SuperClass - VirtualMethod");