抱歉,这听起来很简单,但我正在寻求一些帮助来改进我的代码:)

所以我目前有以下实现(我也写过):

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。 TechnologyXPriorityOptimizerTechnologyXGenericOptimizer具有完全相同的“额外”方法,因为它们涉及相同的技术。有没有办法使该方法对两个继承分支都通用?

Q2。对于AbstractGenericOptimizer,优化器对int param的特殊值有一个特殊的名称,因此最好扩展基本的通用优化器类(对参数进行硬编码),然后对每个分区使用特定于技术的实现:
AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer

AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....

重构此方案的最佳方法是什么?我觉得有一个更聪明的方法来减少继承级别的数量。

谢谢!

最佳答案

您可能应该使用包容而不是继承。

例如,您可以使用每种技术的具体实现创建一个抽象的OptimizerStrategy类,然后使GenericOptimizerPriorityOptimizerOptimizerStrategy作为泛型类型参数或构造函数参数。

10-04 17:57