В системе управления профессиональным обучением у меня есть абстрактный класс CourseBase
, который я решил использовать в пользу интерфейса ICourse
, потому что я предпочел бы избегать дублирования кода реализации для всех классов, полученных из гипотетического, база Course
сущность.Каждый курс имеет список предметов, с любым предметом, определенным абстрактным классом SubjectBase
.Итак, у меня есть, например,
public abstract class CourseBase : BaseObject
{
public IEnumerable<SubjectBase> Subjects
{
get { return new List<SubjectBase>(); }
}
}
public abstract class SubjectBase
{
public string Name { get; set; }
public string Description { get; set; }
public int ValidityPeriod { get; set; }
}
Теперь я хочу добавить конкретный класс LocalCourse
, который содержит коллекцию LocalCourseSubject
объектов, но потому что я не использую интерфейс для CourseBase
Я теряю ковариацию, и мне нужно скрыть свойство Subjects
абстрактной базы с моим новым:
public class LocalCourse: CourseBase
{
public IEnumerable<LocalCourseSubject> Subjects
{
get { throw new NotImplementedException(); }
}
}
Я уверен, что я упускаю что-то очень очевидное здесь с точки зрения ОО, но единственные решения, которые я вижу, это:
- Полностью исключить объекты из абстрактной базы и добавить только типизированное свойство коллекции в производные классы.
ISubjectCollectionOwner
в абстрактной базе, а также в конкретных классах.
Прошу извинить меня за тусклость, я уже давно не сталкивался с такой проблемой дизайна.