interface IFace {
	void f();
    void test();
}

abstract class ACl : IFace {
    public abstract void f();
    public void test() {
        f();
    }
}

class BCl : ACl {
    public override void f() {
        System.Console.Error.Write("BCl.f\n");
    }
}

class CCl : BCl, IFace  {
    public override void f() {
        System.Console.Error.Write("CCl.f\n");
    }
}

class DCl : CCl {
    public override void f() {
        System.Console.Error.Write("DCl.f\n");
    }
}

class CCl2 : BCl, IFace {
    public override void f() {
        System.Console.Error.Write("CCl.f\n");
    }
    void IFace.f() {
        System.Console.Error.Write("CCl.IFace.f\n");
    }
}

class DCl2 : CCl2 {
    public override void f() {
        System.Console.Error.Write("DCl.f\n");
    }
}

static public class main {
    static void Main(string[] args) {
        System.Console.Error.Write(">>> BCl\n");
        IFace b = new BCl ();
        b.f ();
        System.Console.Error.Write(">>\n");
        b.test ();
        System.Console.Error.Write(">>> CCl\n");
        IFace c = new CCl ();
        c.f ();
        System.Console.Error.Write(">>\n");
        c.test ();
        System.Console.Error.Write(">>> DCl\n");
        IFace d = new DCl ();
        d.f ();
        System.Console.Error.Write(">>\n");
        d.test ();
        System.Console.Error.Write(">>> CCl2\n");
        IFace c2 = new CCl2 ();
        c2.f ();
        System.Console.Error.Write(">>\n");
        c2.test ();
        System.Console.Error.Write(">>> DCl2\n");
        IFace d2 = new DCl2 ();
        d2.f ();
        System.Console.Error.Write(">>\n");
        d2.test ();
    }
}
