抱歉,这听起来很简单,但我正在寻求一些帮助来改进我的代码:)
所以我目前有以下实现(我也写过):
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
,优化器对int param
的特殊值有一个特殊的名称,因此最好扩展基本的通用优化器类(对参数进行硬编码),然后对每个分区使用特定于技术的实现:AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer
AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....
重构此方案的最佳方法是什么?我觉得有一个更聪明的方法来减少继承级别的数量。
谢谢!
最佳答案
您可能应该使用包容而不是继承。
例如,您可以使用每种技术的具体实现创建一个抽象的OptimizerStrategy
类,然后使GenericOptimizer
和PriorityOptimizer
以OptimizerStrategy
作为泛型类型参数或构造函数参数。