main
 1namespace domain
 2{
 3  using System;
 4  using System.Collections.Generic;
 5  using System.Linq;
 6
 7  public class Gas : ICommodity
 8  {
 9    public Percent PercentageFrom(IComposition composition)
10    {
11      return composition.PercentageFor<Gas>();
12    }
13  }
14
15  public class Oil : ICommodity
16  {
17    public Percent PercentageFrom(IComposition composition)
18    {
19      return composition.PercentageFor<Oil>();
20    }
21  }
22
23  public class NGL : ICommodity
24  {
25    public Percent PercentageFrom(IComposition composition)
26    {
27      return composition.PercentageFor<NGL>();
28    }
29  }
30
31  public class Condensate : ICommodity
32  {
33    public Percent PercentageFrom(IComposition composition)
34    {
35      return composition.PercentageFor<Condensate>();
36    }
37  }
38
39  public class All : ICommodity
40  {
41    public Percent PercentageFrom(IComposition composition)
42    {
43      return composition.PercentageFor<Gas>()
44        .Plus(composition.PercentageFor<Oil>())
45        .Plus(composition.PercentageFor<NGL>())
46        .Plus(composition.PercentageFor<Condensate>());
47    }
48  }
49
50  public interface ICommodity
51  {
52    Percent PercentageFrom(IComposition composition);
53  }
54}