using System;
public class Program
{
public void Main()
var macho = new Cachorro();
var femea = new Cachorro();
var filhote = Cruzar(macho, femea);
Console.Write(filhote.GetType());
}
public T Cruzar<T>(T macho, T femea) where T : Mamifero<T>
var filhote = Activator.CreateInstance<T>();
filhote.Mae = femea;
filhote.Pai = macho;
return filhote;
public abstract class Mamifero<T> where T : Mamifero<T>
public T Pai { get; set; }
public T Mae { get; set; }
public decimal Peso { get; set; }
public class Cachorro : Mamifero<Cachorro>
public string Raca { get; set; }
public class Gato : Mamifero<Gato>
public int Bigode { get; set; }
public class Elefante : Mamifero<Elefante>
public int Tromba { get; set; }