using System.IO;
using System;
abstract class A
{
public void Testme(A other)
{
Console.WriteLine("value from this: " + Value() + " value from other: " + other.Value());
}
protected abstract string Value();
}
class B : A
{
protected override string Value()
{
return "B class";
}
}
class C : A
{
protected override string Value()
{
return "C class";
}
}
class Program
{
static void Main()
{
B b = new B();
C c = new C();
b.Testme(c);
}
}
// value from this: B class value from other: C class
dXNpbmcgU3lzdGVtLklPOwp1c2luZyBTeXN0ZW07CgphYnN0cmFjdCBjbGFzcyBBCnsKICAgIHB1YmxpYyB2b2lkIFRlc3RtZShBIG90aGVyKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ2YWx1ZSBmcm9tIHRoaXM6ICIgKyBWYWx1ZSgpICsgIiB2YWx1ZSBmcm9tIG90aGVyOiAiICsgb3RoZXIuVmFsdWUoKSk7CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzdHJpbmcgVmFsdWUoKTsKfQoKY2xhc3MgQiA6IEEKewogICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBWYWx1ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICJCIGNsYXNzIjsKICAgIH0KfQoKY2xhc3MgQyA6IEEKewogICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBWYWx1ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICJDIGNsYXNzIjsKICAgIH0KfQoKCgpjbGFzcyBQcm9ncmFtCnsKICAgIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIEIgYiA9IG5ldyBCKCk7CiAgICAgICAgQyBjID0gbmV3IEMoKTsKICAgICAgICAKICAgICAgICBiLlRlc3RtZShjKTsKICAgIH0KfQoKLy8gdmFsdWUgZnJvbSB0aGlzOiBCIGNsYXNzIHZhbHVlIGZyb20gb3RoZXI6IEMgY2xhc3M=