Извините, если это звучит простым, но я ищу некоторую справку для улучшения моего кода:)
Таким образом, у меня в настоящее время есть следующая реализация (который я также записал):
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
....
Каков был бы лучший способ осуществить рефакторинг этот сценарий? Я чувствую, что существует более умный способ сократить количество уровней наследования.
Спасибо!
Вам, вероятно, следует использовать сдерживание вместо наследования.
Например, вы можете создать абстрактный класс OptimizerStrategy
с конкретными реализациями для каждой технологии, а затем заставить GenericOptimizer
и PriorityOptimizer
использовать OptimizerStrategy
как аргумент универсального типа или параметр конструктора.
Специально я склонен сказать, что вы не можете получить желаемый дизайн, используя только наследование. У вас должны быть ортогональные пути наследования - приоритетные и общие, с одной стороны, и технологии X и Y, с другой. Вы хотите объединить код из обоих путей в возможных четырех комбинациях, но для этого потребуется множественное наследование - наследование от приоритета или универсального и технологии X или Y. Поскольку C # не поддерживает множественное наследование, это не сработает.
Я бы попытался решить эту проблему, используя интерфейсы и шаблон стратегии . Это должно позволить вам выделить код, специфичный для всех четырех основных компонентов, в отдельные классы, а затем всегда объединять два из них в каждой из четырех желаемых комбинаций.