ОБНОВЛЕНИЕ: Практически все здесь говорили мне, что мне просто нужно начать все сначала с того, как я спроектировал свои классы (кстати, спасибо, ребята, за отличные ответы!). Поняв намек, я начал подробно изучать шаблон стратегии. Я хочу создать классы поведения (или классы стратегии), которые наследуются от абстрактного базового класса или классов. Тогда класс Candidate будет иметь свойства с различными абстрактными базовыми классами / классами как Type
для поведения или стратегий. может быть что-то вроде этого:
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
}
Есть комментарии или предложения?
ОРИГИНАЛЬНЫЙ вопрос:
Я пытаюсь изучить шаблоны и принципы проектирования и стать более опытным. В настоящее время я работаю над дизайном для нескольких классов, которые меня озадачили. Вот очень сжатая версия кода:
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
}
Класс InternalEntryLevelCandidate в первую очередь является EntryLevelCandidate, но должен совместно использовать некоторые реализации InternalCandidate. Я говорю «реализации», потому что не хочу, чтобы реализации отличались или повторялись, иначе я бы использовал интерфейс для общих контрактов и имел бы конкретные реализации в каждом классе. Некоторые реализации свойств и поведения InternalCandidate должны быть общими или совместно используемыми. Я читал о миксинах C ++ и Ruby, которые кажутся чем-то похожим на то, что я хочу делать. Я также прочитал этот интересный пост в блоге, в котором обсуждается идея типа поведения, при котором класс мог бы наследовать несколько вариантов поведения, сохраняя при этом единственное отношение «есть»: http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx. Кажется, это передает то, чего я хочу. Может ли кто-нибудь дать мне какое-нибудь руководство о том, как я могу добиться этого, используя хорошие методы проектирования?