using System.Collections.Generic;
public interface IColorProvider
public class ColorProvider : IColorProvider
private string _name = "blue";
public void SetName(string name) { _name = name; }
public string GetName() { return _name; }
public abstract class Cup
private readonly IColorProvider _colorProvider;
protected Cup(IColorProvider colorProvider)
_colorProvider = colorProvider;
public string ColorName {
get => _colorProvider.GetName();
public class TeaCup : Cup
public TeaCup() : base(null) { }
public TeaCup(IColorProvider colorProvider) : base(colorProvider) { }
public class CoffeeCup : Cup
public CoffeeCup() : base(null) { }
public CoffeeCup(IColorProvider colorProvider) : base(colorProvider) { }
private static void Main(string[] args)
var colorProvider = new ColorProvider();
var cup1 = new TeaCup(colorProvider);
var cup2 = new CoffeeCup(colorProvider);
Console.WriteLine("color = {0}", colorProvider.GetName());
colorProvider.SetName( "red");
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);
colorProvider.SetName( "green");
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);