public interface ITrait<T> : ITrait
public interface IContainer
void AddChild(IShape shape);
public class Circle : IShape, ITrait<IShape>, IContainer, ITrait<IContainer>
IShape ITrait<IShape>.Value => this;
IContainer ITrait<IContainer>.Value => this;
public int Radius {get;set;}
public Circle(int radius) => Radius = radius;
Console.WriteLine($"Render Circle radius: {Radius}");
public void Scale(int factor)
public void AddChild(IShape shape)
Console.WriteLine("Encode Circle");
public class ShapeManager
public static ITrait<IShape> Render(ITrait<IShape> shape)
public static void Main()
var circle = new Circle(2);
var shape = ShapeManager.Render(circle);
shape = ShapeManager.Render(circle);