Ради закрытия я подумал, что обновлю пост с результатами моих усилий, хотя я отдаю должное ответу и Брэндона, и Флориана за то, что он отправил меня по правильному пути.
Я закончил с интерфейсом, как предложил Брэндон, под названием IHaveRecurrence, определенным следующим образом:
public interface IHaveRecurrence
{
DateTime? LastOccurrence { get; }
RecurrenceType RecurrenceType { get; }
Int32 RecurrenceValue { get; }
Boolean IsDue();
}
Мой класс MaintainableTool (base) теперь реализует этот интерфейс.Метод IsDue реализуется путем делегирования классу Recurrence:
public Boolean IsDue()
{
return Recurrence.IsDue(this);
}
Recurrence - это абстрактный базовый класс, предложенный Флорианом.У меня есть несколько подклассов, таких как DailyRecurrence, WeeklyRecurrence и т. Д. Каждый из подклассов соответствует одному из значений в перечислении RecurrenceType и реализует соответствующую логику, чтобы определить, должен ли PM быть задан на основе свойств RecurrenceValue и LastOccurrence через интерфейс IHaveRecurrence.
Recurrence использует внутренний класс RecurrenceFactory для определения, какой подкласс использовать:
internal sealed class RecurrenceFactory
{
public Recurrence GetRecurrence(RecurrenceType type)
{
switch (type)
{
case Daily: return new DailyRecurrence;
:
}
}
}
И Recurrence реализуется следующим образом:
public abstract class Recurrence : IDisposable
{
public static Boolean IsDue(IHaveRecurrence recurringObj)
{
using (var recurrence = RecurrenceFactory.GetRecurrence(recurringObj.RecurrenceType))
{
return recurrence.GetIsDue(recurringObj);
}
}
protected abstract Boolean GetIsDue(IHaveRecurrence recurringObj);
}
Затем, например, класс DailyRecurrenceреализован так:
public sealed class DailyRecurrence : Recurrence
{
protected override Boolean GetIsDue(IHaveRecurrence recurringObj)
{
if (recurringObj.LastOccurred.HasValue)
return recurringObj.LastOccurred.AddDays(recurringObj.RecurrenceValue) <= DateTime.Now;
return true;
}
}
Мне нравится эта модель, так как она очень расширяемая, инкапсулирует логику, необходимую для разрешения каждого шаблона повторения, и поддерживает мой бизнес-объект в чистоте.