Привет У меня есть набор класса 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>();
}
}