ОБНОВЛЕНИЕ: Так почти все здесь сказали мне, что мне просто нужно начинать сначала с того, как я разработал свои классы (спасибо вам за ваши отличные ответы, кстати!). Взяв намек, я начал делать обширные чтения на strategy pattern. Я хочу создать классы поведения (или классы стратегии), которые наследуются от абстрактного базового класса или классов. Класс Candidate тогда имел свойства w/различные абстрактные базовые классы/классы как Type
для поведения или стратегий. возможно, что-то вроде этого:Как реализовать общее поведение между классами (без множественного наследования) в 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
}
Любые комментарии или предложения?
ORIGINAL Вопрос:
Я пытаюсь учиться и стать более опытными в шаблонах проектирования и принципов. В настоящее время я работаю над дизайном для нескольких классов, которые меня настораживают. Вот очень сокращенный вариант кода:
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 mixins, которые кажутся чем-то похожим на то, что я хочу сделать. Я также прочитал это интересное сообщение в блоге, в котором обсуждается идея типа поведения, когда класс сможет унаследовать множественное поведение, сохраняя при этом единственное отношение «есть»: http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx. Кажется, это говорит о том, чего я хочу. Может ли кто-нибудь дать мне какое-то направление, как я могу это сделать, используя хорошие методы проектирования?
Я думаю, что вы должны думать на примере, что однозначно нужно множественное наследование, его будет очень тяжело –
@ samob99: Во-первых, ТНХ для всех ваших предложений и мыслей! Я не пытаюсь использовать множественное наследование.Я, возможно, закодировал себя в сценарий, где я неоднозначно нуждаюсь в множественном наследовании, но моя проблема в том, что я не знаю, как закодировать код. Как я должен был спроектировать эти классы, чтобы мне не приходилось неоднозначно нуждаться в множественном наследовании? Пример кода, связанный с принципом проектирования, будет наиболее полезен. – gabe