更新:几乎这里的每个人都告诉我,我只需要重新开始我如何设计我的课程(顺便感谢你们的出色回答!)。得到提示后,我开始广泛阅读策略模式。我想创建从一个或多个抽象基类继承的行为类(或策略类)。然后,候选类将具有带有不同抽象基类/类的属性作为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 mixins,这似乎与我想做的类似。我还阅读了这篇有趣的博客文章,其中讨论了一种行为类型的想法,其中一个类能够继承多个行为,同时仍然保持单一的“是”关系:http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx。这似乎传达了我想要的东西。谁能给我一些指导,告诉我如何使用良好的设计实践来实现这一目标?