Рефакторинг абстрактного класса в С#
Извините, если это звучит просто, но я ищу некоторую помощь для улучшения моего кода:)
Итак, у меня есть следующая реализация (которую я также написал):
public interface IOptimizer
{
void Optimize();
string OptimizerName { get; }
}
public abstract AbstractOptimizer : IOptimizer
{
public void Optimize()
{
// General implementation here with few calls to abstract methods
}
}
public abstract AbstractPriorityOptimizer : AbstractOptimizer
{
// Optimize according to priority criteria.
string Name
{
get { return "Priority Optimizer"; }
}
}
Затем у меня есть специфичные для конкретной технологии конкретные классы:
TechnologyXPriorityOptimizer : AbstractPriorityOptimizer
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer
Теперь я пытаюсь добавить общий оптимизатор, который оптимизируется для условий, отличных от приоритета, поэтому моя попытка:
public abstract AbstractGenericOptimizer : AbstractOptimizer
{
// Optimize according to a generic criteria.
private readonly int param;
public AbstractGenericOptimizer (int param) : base()
{
// param affects the optimization
this.param = param;
}
}
и мне также нужна техническая реализация, как и оптимизатор приоритетов:
TechnologyXGenericOptimizer : AbstractGenericOptimizer
TechnologyYGenericOptimizer : AbstractGenericOptimizer
Q1. TechnologyXPriorityOptimizer
и TechnologyXGenericOptimizer
имеют одинаковые точные "дополнительные" методы, поскольку они связаны с одной и той же технологией. Есть ли способ сохранить этот метод общим для обеих ветвей наследования?
Q2. Для AbstractGenericOptimizer
оптимизатор имеет специальное имя для специальных значений int param
, так что было бы неплохо расширить базовый класс оптимизатора (где параметр жестко запрограммирован), а затем для каждого подразделения, имеют технологию -специфическая реализация:
AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer
AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....
Каким будет лучший способ реорганизации этого сценария? Я считаю, что существует более разумный способ уменьшить количество уровней наследования.
Спасибо!
Ответы
Ответ 1
Вероятно, вы должны использовать сдерживание вместо наследования.
Например, вы можете создать абстрактный класс OptimizerStrategy
с конкретными реализациями для каждой технологии, а затем сделать GenericOptimizer
и PriorityOptimizer
взять OptimizerStrategy
в качестве аргумента или конструктора типового типа.
Ответ 2
Ad hoc Я склонен говорить, что вы не можете получить желаемый дизайн, используя только наследование. У вас есть пути ортогонального наследования - приоритет и общий с одной стороны, а технология X и Y - с другой. Вы хотите комбинировать код с обоих путей в возможных четырех комбинациях, но для этого потребуется множественное наследование - наследование от приоритета или общего, а также технология X или Y. Поскольку С# не поддерживает множественное наследование, это не сработает.
Я попытался бы решить эту проблему, используя интерфейсы и шаблон стратегии. Это должно позволить вам извлечь код, специфичный для всех четырех основных компонентов, в отдельные классы, а затем объединить всегда два из них в каждой из четырех желаемых комбинаций.