在管理的职业培训制度,我有一个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(); }
}
}
我敢肯定,我错过了从一个角度OO点东西在这里很明显,但唯一的解决方案,我可以看到的是:
- 完全忽略抽象基础中的主题,并且只将特定类型的集合属性添加到派生类中。
- 在抽象基础和具体类中实现一个接口,如
ISubjectCollectionOwner
。
请原谅我的朦胧,这已经有一段时间了,因为我有幸遇到过这样的设计问题。
您正在使用哪种版本的C#和.NET?它在通用方差方面有所不同。顺便问一下,你真的需要所有的抽象吗?你会有什么不同类型的课程和科目? –
不是SubjectBase的要点,因此您可以使用多态性来处理所有相同的主题。你不能只是摆脱你的主体覆盖,并使用CourseBase主题集合呢? –
@Jon,v4。我的'规范'是为了迎合'各种各样的事情',所以我只是在早期获得足够的抽象以支持基本实体的广泛扩展而赌博。 – ProfK