Я просматриваю шаблоны Head First Design (только что пришел недавно), и я читал о шаблоне стратегии, и мне пришло в голову, что это отличный способ реализовать общий способ расчета налогов и т.д. на всех конкретных объектах, которые я использую на работе, но у меня возник вопрос об этом.
Вот что я думал:
public interface ITax
{
decimal ProvincialTaxRate { get; set; } // Yes, I'm Canadian :)
decimal CalculateTax(decimal subtotal);
}
public SaskatchewanTax
{
public decimal ProvincialTaxRate { get; set; }
public SaskatchewanTax()
{
ProvincialTaxRate = new decimal(0.05f);
}
public decimal CalculateTax(subtotal)
{
return ProvincialTaxRate * subtotal + FederalTaxRate * subtotal;
}
}
public OntarioTax
{
public decimal ProvincialTaxRate { get; set; }
public OntarioTax()
{
ProvincialTaxRate = new decimal(0.08f);
}
public decimal CalculateTax(decimal subtotal)
{
return ProvincialTaxRate * subtotal + FederalTaxRate * subtotal;
}
}
Возможно, вы заметили, что нет заявления FederalTaxRate и того, что я хотел спросить. Куда это должно пойти?
- Передача его конструктору для каждого конкретного ITax кажется излишним и позволяла бы ошибочное поведение (все налоговые калькуляторы должны обладать одинаковой ставкой федерального налога).
- Аналогичным образом, создание члена ITax также может быть непоследовательным.
Должны ли все налоговые калькуляторы наследовать от какого-либо другого класса, где он определен как статически, так и ITax?
public class TaxCalculator
{
public static decimal FederalTaxRate = new decimal(0.05f);
}