在C#中重构抽象类

Had*_*adi 13 c# abstract-class design-patterns

对不起,如果这听起来很简单,但我正在寻找一些帮助来改善我的代码:)

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

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"; }
     }      
}
Run Code Online (Sandbox Code Playgroud)

然后我有技术特定的具体课程:

TechnologyXPriorityOptimizer : AbstractPriorityOptimizer 
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer 
Run Code Online (Sandbox Code Playgroud)


现在我正在尝试添加一个通用优化器,一个优化优先级以外的条件的优化器,所以我的尝试:

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;
     }        
}
Run Code Online (Sandbox Code Playgroud)

我还需要像优先级优化器一样的技术特定实现:

TechnologyXGenericOptimizer : AbstractGenericOptimizer 
TechnologyYGenericOptimizer : AbstractGenericOptimizer 
Run Code Online (Sandbox Code Playgroud)


Q1.TechnologyXPriorityOptimizer并且TechnologyXGenericOptimizer具有相同的"额外"方法,因为它们涉及相同的技术.有没有办法让这个方法对两个继承分支都是通用的?

Q2.因为AbstractGenericOptimizer,优化器对int的特殊值有一个特殊的名称param,所以扩展基础通用优化器类(其中param是硬编码的)然后为每个部门提供特定于技术的实现是一个好主意:

AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer

AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....
Run Code Online (Sandbox Code Playgroud)

重构这种情况的最佳方法是什么?我觉得有一种更聪明的方法可以减少继承级别.

谢谢!

SLa*_*aks 8

您应该使用包含而不是继承.

例如,您可以OptimizerStrategy为每种技术创建一个具体实现的抽象类,然后创建GenericOptimizer并将PriorityOptimizerOptimizerStrategy作为泛型类型参数或构造函数参数.