using System;
public interface IBird
{
Egg Lay();
}
public class Chicken : IBird
public Chicken()
public Egg Lay()
return new Egg(() => new Chicken());
public class Egg
IBird bird;
public Egg(Func<IBird> createBird)
bird = createBird.Invoke();
public IBird Hatch()
return bird;
public class Program
public static void Main()
var chicken1 = new Chicken();
Console.WriteLine("chicken1 is {0}", chicken1.GetType().Name);
var egg = chicken1.Lay();
var childChicken = egg.Hatch();
Console.WriteLine("childChicken is {0}", childChicken.GetType().Name);