更新:ここにいるほとんどの人が、クラスの設計方法を最初からやり直す必要があると言っています(ちなみに、素晴らしい回答をありがとう!)。ヒントを得て、私は戦略パターンを読み始めました。1 つまたは複数の抽象基本クラスから継承する動作クラス (または戦略クラス) を作成したいと考えています。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 の mixin について読んだことがありますが、これは私がやりたいことに似ているようです。また、単一の「is a」関係を維持しながら、クラスが複数の動作を継承できる動作タイプのアイデアについて説明している興味深いブログ投稿も読みました。http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx . これは私が望んでいることを伝えているようです。優れた設計手法を使用してこれを達成する方法について、誰かが私に指示を与えることができますか?