Sorry, wenn das klingt einfach, aber ich bin auf der Suche nach etwas Hilfe mein Code zu verbessern :)Refactoring abstrakte Klasse in C#
Also zur Zeit habe ich die folgende Implementierung (die ich schrieb auch):
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"; }
}
}
Dann hat ich technologiespezifische konkrete Klassen:
TechnologyXPriorityOptimizer : AbstractPriorityOptimizer
TechnologyYPriorityOptimizer : AbstractPriorityOptimizer
Jetzt versuche ich, ein generisches Optimierungsprogramm an, eine, die für optimiert andere Bedingungen als Priorität, so dass mein Versuch:
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;
}
}
und ich brauche auch technologiespezifische Umsetzung ebenso wie die Priorität Optimierer:
TechnologyXGenericOptimizer : AbstractGenericOptimizer
TechnologyYGenericOptimizer : AbstractGenericOptimizer
Q1. TechnologyXPriorityOptimizer
und TechnologyXGenericOptimizer
haben die gleichen genauen "extra" Methoden, weil sie die gleiche Technologie beinhalten. Gibt es eine Möglichkeit, diese Methode für beide Vererbungszweige gemeinsam zu verwenden?
Q2. Für AbstractGenericOptimizer
, der Optimierer hat einen speziellen Namen für spezielle Werte des int param
, so wäre es eine gute Idee, die Basis generische Optimierer Klasse zu erweitern (wo param ist hardcoded) und dann für jede Abteilung, eine Technologie-spezifische Implementierung:
AbstractSpecialName1Optimizer: AbstractGenericOptimizer
TechnologyXSpecialName1Optimizer: AbstractSpecialName1Optimizer
TechnologyYSpecialName1Optimizer: AbstractSpecialName1Optimizer
AbstractSpecialName2Optimizer: AbstractGenericOptimizer
....
Was wäre der beste Weg, dieses Szenario zu refaktorieren? Ich glaube, dass es eine klügere Möglichkeit gibt, die Anzahl der Vererbungsebenen zu reduzieren.
Danke!
Vielen Dank für Ihren Vorschlag. In diesem Fall implementiere ich Optimize() in der OptimizerStrategy-Klasse? Was soll ich mit IOptimizer machen? – alhazen
Ich habe keine Ahnung; Es hängt davon ab, was der Code tatsächlich tut. Wahrscheinlich jedoch beides. – SLaks