using System.Collections.Generic;
public const decimal TAX = 1.1m;
public static void Main()
List<Thing> things = new List<Thing>{
new ThingSingle{ Name = "thing 1", UnitPrice = 2m},
new ThingMultiple { Name = "thing 2", Units = 10, UnitPrice = 3m},
new ThingMultiple { Name = "thing 3", Units = 20, UnitPrice = 5m}
IVisitor calc = new Calculate();
Console.WriteLine("{0} - Total with tax = {1}", t.Name, t.TotalWithTax);
Console.WriteLine("{0} - Units = {1} - Total price = {2} - Total with tax = {3}", t.Name, t.Units, t.Total, t.TotalWithTax);
public interface IVisitor {
public abstract class Thing {
public string Name {get; set;}
public virtual int Units {get; set;}
public decimal UnitPrice {get; set;}
public virtual decimal Total {get; set;}
public decimal TotalWithTax {get; set;}
public virtual void Accept(IVisitor visitor){
public class ThingSingle: Thing {
public override int Units {get {return 1;}}
public override decimal Total {get { return UnitPrice; }}
public class ThingMultiple: Thing {
public class Calculate : IVisitor
public void Visit(Thing thing){
if(thing is ThingMultiple)
thing.Total = thing.Units * thing.UnitPrice;
thing.TotalWithTax = thing.Total * TAX;