クラスを設計する

こんにちは私はさまざまなタイプのMeasures.Iの計算を行うCalculatorクラスのセットを持って、Measureのタイプに基づいて適切なクラスを呼び出すファクトリクラスも持っています。

これが私のクラスの様子です。

 private MeasureBase GetMeasureCalculator(MeasureType measureType)
    {
       MeasureBase returnValue;
        switch (measureType) 
        {
            case NewPqriMeasureType.Type1:
                returnValue = new Type1Calculator(_session);
                break;
            case NewPqriMeasureType.Type2:
                returnValue = new Type2Calculator(_session);
                break;
            default:
                returnValue = new Type1Calculator(_session);
                break;
        }
        return returnValue;
    }

このファクトリメソッドは、このように呼び出されます。

   public IEnumerable GetMeasureResults(IEnumerable measures, 
        IFocusSettings focusSettings)
    {
        IEnumerable returnValue = Enumerable.Empty();

        IEnumerable measureDefinitions = _session.QueryOver()
          .WhereRestrictionOn(
              measure => measure.Id
          )
          .IsIn(measures.ToArray())
          .List();

        foreach (MeasureType measureType in Enum.GetValues(typeof(MeasureType)))
        {
            IEnumerable measureKeys = measureDefinitions
                .Where(measureDefinition => measureDefinition.MeasureType == measureType)
                .Select(measureDefinition => measureDefinition.Id);

            if (measureKeys.Count() > 0)
            {
                returnValue = returnValue.Concat(
                    GetMeasureCalculator(measureType)//factory method
                        .CalculateMeasureResults(measureKeys, focusSettings)
                );
            }
        }

        return returnValue;
    }

CalculateMeasureResults メソッドは、 MeasureBase クラスにあります。 。

ここに私の問題があります。メジャーのための私のタイプ2は再びサブタイプ化されます。 Type2_a Type2_b のように入力します。どのように私は現在のデザインにそれを組み込むことができます。 私が望むのは、 Type2_a Type2_b の2つの具体的なクラスです。 Type2Calculator.CalculateMeasureResults を呼び出すと、これらの2つのサブタイプの計算が呼び出され、結果が返されます。私の現在のデザインデザインでは、CalculateMeasureResultsがベースクラスで定義されているため、これは許されません。

MeasureBaseClass

public abstract class MeasureBase
{

    protected MeasureBase(ISession session)

    {
        _session = session;

    }

    public abstract MeasureType AggregationType { get; }


     public string abstract DoFunction1();

     public string abstract DoFunction2();


    public IEnumerable CalculateMeasureResults(IEnumerable measures,
                                                                           IFocusSettings focusSettings)
    {
        return _session.CreateSQLQuery(     DoFunction1()+DoFunction2()
                          )

       )
       .SetResultTransformer(Transformers.AliasToBean())
       .List();
    }

}
0

1 答え

素早くハッキーな修正が必要な場合は、基本クラスのCalculateMeasureResultsを仮想クラスとして宣言し、余裕でオーバーライドしてください。

しかし、それは見えるから、CalculateMeasureResultsは抽象メソッドでなければなりません。別の抽象クラスを使用してサブクラス化すると、現在MeasureBaseに存在し、そこからサブクラスにあるデフォルトの実装を提供できます。

1
追加された
ええ。私はそれについて考えた....しかし、あなたが言ったようにハッキーのようだ...
追加された 著者 Ashley John,
。さらに、サブタイプ化されていない型を提案し、2番目の抽象クラスと抽象メソッドを持つ最初の基本クラスからさらに派生した型に由来しますか?
追加された 著者 Ashley John,
@AshleyJohnはアップデートを見ます。
追加された 著者 Rich O'Kelly,
主に、冗長性を導入することなく(そしてLiskovの置換原則が確実に適用されるように)、できるだけシンプルな型階層を作成することを提案します。あなたの質問の情報に基づいて:はい、それは妥当と思われます。
追加された 著者 Rich O'Kelly,