AKTUALISIERT: So ziemlich jeder hier hat mir gesagt, dass ich nur neu anfangen muss auf, wie ich meine Klassen entwarf (danke Leute dafür Ihre ausgezeichneten Antworten übrigens!). Den Hinweis nehmend, fing ich an, umfangreiche Lesung auf dem strategy pattern zu machen. Ich möchte Verhaltensklassen (oder Strategieklassen) erstellen, die von einer abstrakten Basisklasse oder -klassen erben. Die Kandidatenklasse würde dann Eigenschaften mit den verschiedenen abstrakten Basisklassen/Klassen als Type
für die Verhaltensweisen oder Strategien haben. vielleicht etwas wie das:Wie man geteiltes Verhalten zwischen Klassen (ohne mehrfache Vererbung des Kurses) in C#
public abstract class SalaryStrategy {
public abstract decimal Salary { get; set; }
public abstract decimal Min { get; set; }
public abstract decimal Mid { get; set; }
public decimal CompaRatio {
get {
if (this.Mid == 0) { return 0; }
else { return this.Salary/this.Mid; }
}
}
}
public class InternalCurrentSalaryStrategy {
public override decimal Salary { get; set; }
public override decimal Min {
get { return this.Salary * .25m; }
set { }
}
public override decimal Mid { get; set; }
}
public class Candidate {
public int Id { get; set; }
public string Name { get; set; }
public SalaryStrategy CurrentSalaryStrategy { get; set; }
}
public static void Main(string[] args) {
var internal = new Candidate();
internal.CurrentSalaryStrategy = new InternalCurrentSalaryStrategy();
var internalElp = new Candidate();
internalElp.CurrentSalaryStrategy = new InternalCurrentSalaryStrategy();
var elp = new Candidate();
// elp.CurrentSalaryStrategy can stay null cause it's not used for elps
}
Kommentare oder Anregungen?
ORIGINAL Frage:
ich versuche zu lernen und mehr beherrschen zu Design Patterns und Prinzipien werden. Ich arbeite gerade an einem Design für wenige Klassen, das mich überhäuft hat. Hier ist eine sehr verkürzte Version des Codes:
public class Candidate {
public int Id { get; set; }
public string Comments { get; set; }
// lots more properties and behaviors...
}
public class InternalCandidate : Candidate {
public decimal CurrentMid { get; set; }
public decimal CurrentMax {
get { return this.CurrentMin * 1.3m;
}
// lots more properties and behaviors...
}
public class EntryLevelCandidate : Candidate {
public string Gpa { get; set; }
// lots more properties and behaviors...
}
public class InternalEntryLevelCandidate /* what do I inherit here??? */ {
// needs all of the properties and behaviors of
// EntryLevelCandidate but also needs the CurrentMin and
// CurrentMax (and possibly more) in InternalCandidate
}
Die InternalEntryLevelCandidate Klasse in erster Linie ein EntryLevelCandidate ist aber braucht einige der Implementierungen von InternalCandidate zu teilen. Ich sage Implementierungen, weil ich nicht möchte, dass sich die Implementierungen unterscheiden oder wiederholen, sonst würde ich eine Schnittstelle für allgemeine Verträge verwenden und konkrete Implementierungen in jeder Klasse haben. Einige Implementierungen der Eigenschaften und Verhaltensweisen von InternalCandidate müssen gemeinsam oder gemeinsam verwendet werden. Ich habe über C++ - und Ruby-Mixins gelesen, die etwas ähnlich zu dem zu sein scheinen, was ich machen möchte. Ich lese auch diesen interessanten Blogbeitrag, in dem eine Idee für einen Verhaltenstyp diskutiert wird, bei dem eine Klasse mehrere Verhaltensweisen erben kann, während eine einzelne Beziehung beibehalten wird: http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx. Dies scheint zu vermitteln, was ich will. Kann mir jemand eine Anleitung geben, wie ich dies mit guten Designpraktiken erreichen kann?
Ich glaube, Sie durch ein Beispiel denken müssen, die eindeutig Mehrfachvererbung muss, hart sein sein Gehen wirklich –
@ samob99: Erstens, thx für alle Ihre Vorschläge und Gedanken! Ich versuche nicht speziell, Mehrfachvererbung zu verwenden.Ich habe mich vielleicht in ein Szenario verschlüsselt, in dem ich zweideutig mehrfache Vererbung benötige, aber mein Problem ist, dass ich nicht weiß, wie ich es wieder programmieren soll. Wie sollte ich diese Klassen entworfen haben, damit ich nicht mehrfache Vererbung benötige? Ein Codebeispiel, das mit einem Entwurfsprinzip verknüpft ist, wäre am hilfreichsten. – gabe