Я изо всех сил стараюсь придерживаться принципа замещения Лискова при создании своей классовой структуры. Я хочу иметь коллекцию элементов календаря, хранящуюся в классе Day. Должно быть несколько разных типов CalendarItem, например:
Назначение
NoteItem
RotaItem
все они имеют общую функциональность, которая присутствует в абстрактном базовом классе CalendarItem:
public abstract class CalendarBaseItem
{
public string Description { get; private set; }
public List<string> Notes { get; private set; }
public TimeSpan StartTime { get; private set; }
public TimeSpan EndTime { get; private set; }
public int ID { get; private set; }
public DateTime date { get; private set; }
code omitted...
}
но тогда, например, у RotaItem есть некоторые дополнительные функции:
public class RotaItem : CalendarBaseItem
{
public string RotaName { get; private set; }
private bool spansTwoDays;
public bool spanTwoDays()
{
return this.spansTwoDays;
}
}
другие классы также добавляют туда собственную логику и т. д.
У меня есть коллекция CalendarBaseItem для моего дневного класса:
List<CalendarBaseItem> calendarItems;
но, просмотрев это, я вижу, что нарушаю принципы LSP, поскольку мне нужно проверять и приводить каждый конкретный тип, чтобы получить функциональность, которую я желаю для каждого подкласса.
Буду признателен, если кто-нибудь сможет посоветовать, как избежать этой проблемы. Должен ли я использовать композиционный подход и добавить класс CalendarItem к каждому из последних классов, например
public class RotaItem
{
private CalendarBaseItem baseItem;
public string RotaName { get; private set; }
private bool spansTwoDays;
public RotaItem(baseArgs,rotaArgs)
{
baseItem = new CalendarBaseItem(baseArgs);
}
public bool spanTwoDays()
{
return this.spansTwoDays;
}
}
Единственная проблема здесь в том, что тогда мне понадобится отдельная коллекция для каждого Concrete CalendarItem в моем классе Day?
doing it wrong(tm)
при использовании своих классов. Как вы используете эти специфичные для класса функции? - person DarkWanderer   schedule 21.04.2014if (item is RotaItem) {}
вполне допустимо (если вы не перечисляете все элементы в календаре). Если вы планируете иметь много товаров и / или просто хотите что-то более продвинутое, проверьте шаблон посетителя - person DarkWanderer   schedule 21.04.2014