この例では、本当にラフなカットです。しかし、基本的な "事"は、営業日、週、月、年、四半期、十年などがすべて同じことであるということです。 「トップレベル抽象ノード」というものはありません。
与えられた「サイクル」にアクセスする方法を本当に考えなければなりません。一度やり直すと、たとえば、CalculateRate
という呼び出しが階層の最下部に伝播し、その「サイクル」の正解を得ることがわかります。
など
はおそらくない別のクラスを作成し、あなたがBusinessCycleType
列挙を定義することができた構造おそらく
を横断し、指定されたオブジェクトが日、週、年であれば、今、あなたは知っていますナビゲーション。私はあなたが実際に、ターゲットと計算値と料金のオブジェクトを作成しない理由はどのような理由をなどBusinessCycleType
、または特定のBusinessCycleType
てオブジェクトを取得するための方法、またはBusinessCycleTypes
の範囲を、想像してなど
public abstract class BusinessCycle {
double rate = 0;
// an enum that can make traversing the BusinessCycle structure easier.
BusinessCycleType whatAmI;
public double AcutalRate {get; set;}
public double TargetedRate {get; set;}
public double ComputedRate {
get { return CalculateRate(); }
}
// a week has a List of days, a month a list of weeks ...
protected List<BusinessCycle> businessCycleLentgh = new List<BusinessCycle>;
protected double CalculateRate() {
if (businessCycleLength == null) return rate;
rate = 0;
foreach (BusinessCycle cycleLength in businessCycleLength) {
rate += cycleLength.CalculateRate();
}
return rate;
}
} // BusinessCycle class
public class BusinessDay : BusinessCycle {
public BusinessDay() {
this.businessCycleLength.Add(this); // so we don't need a special CalcuateRate() - a BusinessDay has no "sub components"
}
}
public class BusinessWeek : BusinessCycle {}
public class BusinessMonth : BusinessCycle {}
public enum BusinessCycleType {
Day, Week, Month, Quarter, Year
}
メンバーとして、それを次のように使用します。毎週の料金など? – ndtreviv
子要素内でParentNodeを使用することは避けたいと考えていますが、その関係は間違いなくParentNode.Childrenです。 "Rate"と同じですが、これはIRateインターフェイスを実装する単純な構造体を使って定義する方が良いかもしれません、DailyRate:IRate {enum Interval ...}、DailyRate.Interval = Daily –
Lloyd
@ndtreviv:これは私がやっていることです瞬間。編集を参照してください。問題は、これが営業日の前後にピボットすることです。 – Mike