public delegate void ShippingFeeDelegate(double thePrice, ref double fee);
public static void Main()
ShippingFeeDelegate theDel;
ShippingDestination theDest;
Console.WriteLine("What is the destination zone");
theZone = Console.ReadLine();
if (!theZone.Equals("exit"))
theDest = ShippingDestination.getDestinationInfo(theZone);
Console.WriteLine("What is the item price?");
string thePriceStr = Console.ReadLine();
double itemPrice = double.Parse(thePriceStr);
theDel = theDest.calcFees;
if (theDest.m_isHighRisk)
theDel += delegate (double price, ref double itemFee)
theDel(itemPrice, ref theFee);
Console.WriteLine("The shipping fees are: {0} $",theFee);
Console.WriteLine("The whole charge for item is: {0} $", itemPrice+theFee);
Console.WriteLine("Hmm, you seem to have entered an unknown destination");
Console.WriteLine("Would you like to try again?");
} while (theZone != "exit");
abstract class ShippingDestination
public bool m_isHighRisk;
public virtual void calcFees (double price, ref double fee) { }
public static ShippingDestination getDestinationInfo(string dest)
if (dest.Equals("Zone1"))
if (dest.Equals("Zone2"))
if (dest.Equals("Zone3"))
if (dest.Equals("Zone4"))
if (dest.Equals("Zone5"))
internal class Dest_Zone1 : ShippingDestination
public override void calcFees(double price, ref double fee)
internal class Dest_Zone2 : ShippingDestination
public override void calcFees(double price, ref double fee)
internal class Dest_Zone3 : ShippingDestination
public override void calcFees(double price, ref double fee)
internal class Dest_Zone4 : ShippingDestination
public override void calcFees(double price, ref double fee)
internal class Dest_Zone5 : ShippingDestination
public override void calcFees(double price, ref double fee)