using System;
public class Test
{
public static void Main(string[] args){
A a = new A();
B b = new B();
a.Attack(b);
}
}
abstract class Character {
public void Attack(Character c) {
((dynamic)this).DoAttack((dynamic)c);
}
}
class A : Character {
public void DoAttack(A a) { Console.WriteLine("A attacks A"); }
public void DoAttack(B b) { Console.WriteLine("A attacks B"); }
public void DoAttack(C c) { Console.WriteLine("A attacks C"); }
}
class B : Character {
public void DoAttack(A a) { Console.WriteLine("B attacks A"); }
public void DoAttack(B b) { Console.WriteLine("B attacks B"); }
public void DoAttack(C c) { Console.WriteLine("B attacks C"); }
}
class C : Character {
public void DoAttack(A a) { Console.WriteLine("C attacks A"); }
public void DoAttack(B b) { Console.WriteLine("C attacks B"); }
public void DoAttack(C c) { Console.WriteLine("C attacks C"); }
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncyl7CiAgICAgICAgQSBhID0gbmV3IEEoKTsKICAgICAgICBCIGIgPSBuZXcgQigpOwogICAgICAgIGEuQXR0YWNrKGIpOwogICAgfQp9CgogICAgYWJzdHJhY3QgY2xhc3MgQ2hhcmFjdGVyIHsKICAgICAgICBwdWJsaWMgdm9pZCBBdHRhY2soQ2hhcmFjdGVyIGMpIHsKICAgICAgICAgICAgKChkeW5hbWljKXRoaXMpLkRvQXR0YWNrKChkeW5hbWljKWMpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEEgOiBDaGFyYWN0ZXIgewogICAgICAgIHB1YmxpYyB2b2lkIERvQXR0YWNrKEEgYSkgeyBDb25zb2xlLldyaXRlTGluZSgiQSBhdHRhY2tzIEEiKTsgfQogICAgICAgIHB1YmxpYyB2b2lkIERvQXR0YWNrKEIgYikgeyBDb25zb2xlLldyaXRlTGluZSgiQSBhdHRhY2tzIEIiKTsgfQogICAgICAgIHB1YmxpYyB2b2lkIERvQXR0YWNrKEMgYykgeyBDb25zb2xlLldyaXRlTGluZSgiQSBhdHRhY2tzIEMiKTsgfQogICAgfQogICAgY2xhc3MgQiA6IENoYXJhY3RlciB7CiAgICAgICAgcHVibGljIHZvaWQgRG9BdHRhY2soQSBhKSB7IENvbnNvbGUuV3JpdGVMaW5lKCJCIGF0dGFja3MgQSIpOyB9CiAgICAgICAgcHVibGljIHZvaWQgRG9BdHRhY2soQiBiKSB7IENvbnNvbGUuV3JpdGVMaW5lKCJCIGF0dGFja3MgQiIpOyB9CiAgICAgICAgcHVibGljIHZvaWQgRG9BdHRhY2soQyBjKSB7IENvbnNvbGUuV3JpdGVMaW5lKCJCIGF0dGFja3MgQyIpOyB9CiAgICB9CiAgICBjbGFzcyBDIDogQ2hhcmFjdGVyIHsKICAgICAgICBwdWJsaWMgdm9pZCBEb0F0dGFjayhBIGEpIHsgQ29uc29sZS5Xcml0ZUxpbmUoIkMgYXR0YWNrcyBBIik7IH0KICAgICAgICBwdWJsaWMgdm9pZCBEb0F0dGFjayhCIGIpIHsgQ29uc29sZS5Xcml0ZUxpbmUoIkMgYXR0YWNrcyBCIik7IH0KICAgICAgICBwdWJsaWMgdm9pZCBEb0F0dGFjayhDIGMpIHsgQ29uc29sZS5Xcml0ZUxpbmUoIkMgYXR0YWNrcyBDIik7IH0KICAgIH0KICAgIA==