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)
重构这种情况的最佳方法是什么?我觉得有一种更聪明的方法可以减少继承级别.
谢谢!
您应该使用包含而不是继承.
例如,您可以OptimizerStrategy为每种技术创建一个具体实现的抽象类,然后创建GenericOptimizer并将PriorityOptimizer其OptimizerStrategy作为泛型类型参数或构造函数参数.