public static void Main()
var templatedBase = new Templated<Base>();
var myDerived = new Derived();
templatedBase.Test(myBase);
templatedBase.Test(myDerived);
var templatedDerived = new Templated<Derived>();
templatedDerived.Test(myDerived);
public class Base : ICloneable
return "Hello from Base!";
public class Derived : Base
public new object Clone()
public new string GetText()
return "Hello from Derived!";
public class Templated<T> where T : Base
public void Test(T input)
var clone = input.Clone();
Console.WriteLine(clone.GetType());