public class A {
	public virtual void X() { Console.WriteLine("A.X"); }
}
public class B : A {
public override void X() { Console.WriteLine("B.X"); }
public void Y() { Console.WriteLine("B.Y"); }
}

static public class E {
static void X( this A a ) { Console.WriteLine("E.X"); }
static void Y( this A b ) { Console.WriteLine("E.Y"); }

public static void Demo() {
A a = new A();
B b = new B();
A c = new B();

a.X(); // Call A.X
b.X(); // Call B.X
c.X(); // Call B.X

a.Y(); // Call E.Y
b.Y(); // Call B.Y
c.Y(); // Call E.Y
}
}
