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

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

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

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, оптимизатор имеет специальное название специальных значений интервала param, так был бы это быть хорошей идеей расширить основной универсальный класс оптимизатора (где параметрический усилитель является hardcoded), и затем для каждого подразделения, имейте определенную для технологии реализацию:

AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer

AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....

Каков был бы лучший способ осуществить рефакторинг этот сценарий? Я чувствую, что существует более умный способ сократить количество уровней наследования.

Спасибо!

13
задан Hadi 4 February 2010 в 20:16
поделиться

2 ответа

Вам, вероятно, следует использовать сдерживание вместо наследования.

Например, вы можете создать абстрактный класс OptimizerStrategy с конкретными реализациями для каждой технологии, а затем заставить GenericOptimizer и PriorityOptimizer использовать OptimizerStrategy как аргумент универсального типа или параметр конструктора.

8
ответ дан 2 December 2019 в 01:10
поделиться

Специально я склонен сказать, что вы не можете получить желаемый дизайн, используя только наследование. У вас должны быть ортогональные пути наследования - приоритетные и общие, с одной стороны, и технологии X и Y, с другой. Вы хотите объединить код из обоих путей в возможных четырех комбинациях, но для этого потребуется множественное наследование - наследование от приоритета или универсального и технологии X или Y. Поскольку C # не поддерживает множественное наследование, это не сработает.

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

3
ответ дан 2 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: