Рефакторинг абстрактного класса в С#

Извините, если это звучит просто, но я ищу некоторую помощь для улучшения моего кода:)

Итак, у меня есть следующая реализация (которую я также написал):

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. Поскольку С# не поддерживает множественное наследование, это не сработает.

Я попытался бы решить эту проблему, используя интерфейсы и шаблон стратегии. Это должно позволить вам извлечь код, специфичный для всех четырех основных компонентов, в отдельные классы, а затем объединить всегда два из них в каждой из четырех желаемых комбинаций.