public interface I1 { void test(); } public class C1: I1 { public virtual void test() { System.Diagnostics.Debug.WriteLine("c1"); } } public class C2: C1 { public override void test() { System.Diagnostics.Debug.WriteLine("c2"); } } Result: new C1().test(); -> c1 new C2().test(); -> c2 I1 i=new C2(); i.test(); -> c2