public static void Main()
Console.WriteLine(GetClassName(a));
Console.WriteLine(GetClassName(b));
Console.WriteLine(GetClassName(c));
Console.WriteLine(GetClassName(d));
Console.WriteLine(GetClassName(e));
public static string GetClassName<T>(T item) where T : A {
return item.GetClassName();
public static string GetClassName(D item) {
return item.GetClassName();
public class A { public virtual string GetClassName() => "A"; }
public class B : A { public override string GetClassName() => "B"; }
public class C : A { public override string GetClassName() => "C"; }
public class D { public virtual string GetClassName() => "D"; }
public class E : C { public override string GetClassName() => "E"; }