在管理职业培训的系统中,我有一个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 的角度来看,我在这里遗漏了一些非常明显的东西,但我能看到的唯一解决方案是:
- 从抽象基础中完全省略 Subjects,并且只向派生类添加特定类型的集合属性。
ISubjectCollectionOwner
在抽象基类和具体类中实现接口。
请原谅我在这里的昏暗,我已经有一段时间没有遇到这样的设计问题了。