Дизайн классов - PullRequest
       15

Дизайн классов

0 голосов
/ 25 ноября 2011

Привет У меня есть набор класса Calculator, который выполняет вычисления для различных типов мер. У меня также есть фабричный класс, который вызывает соответствующие классы на основе типа Меры.

Вот так выглядит мой класс.

 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<MeasureResult> GetMeasureResults(IEnumerable<int> measures, 
        IFocusSettings focusSettings)
    {
        IEnumerable<PqriMeasureResult> returnValue = Enumerable.Empty<MeasureResult>();

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

        foreach (MeasureType measureType in Enum.GetValues(typeof(MeasureType)))
        {
            IEnumerable<int> 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. Он больше похож на шаблон шаблонного метода, где вызовы функций внутри CalculateMeasureResults переопределяются внутри дочерних классов.

Теперь вот моя проблема. Мой Type2 для мер снова будет подтипом. скажем Type2_a, Type2_b. Как я могу включить его в текущий дизайн. Я хочу иметь два конкретных класса для Type2_a и Type2_b. Когда я вызываю Type2Calculator.CalculateMeasureResults, он должен вызвать метод вычисления для этих двух подтипов и дать мне результат. Мой текущий дизайн проекта не позволяет этого, так как 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<MeasureResult> CalculateMeasureResults(IEnumerable<int> measures,
                                                                           IFocusSettings focusSettings)
    {
        return _session.CreateSQLQuery(     DoFunction1()+DoFunction2()
                          )

       )
       .SetResultTransformer(Transformers.AliasToBean<MeasureResult>())
       .List<MeasureResult>();
    }

}

1 Ответ

1 голос
/ 25 ноября 2011

Если вы ищете быстрое «хакерское» исправление, просто объявите CalculateMeasureResults как виртуальное в вашем базовом классе и переопределите его на досуге.

Но из того, на что это похоже, CalculateMeasureResults должно быть абстрактнымметод.Затем вы можете создать подкласс с другим абстрактным классом, чтобы обеспечить реализацию по умолчанию, которая в настоящее время существует в MeasureBase, и подкласс оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...