【发布时间】:2011-12-22 23:49:18
【问题描述】:
在一个管理职业培训的系统中,我有一个 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。
请原谅我的昏暗,我已经有一段时间没有遇到这样的设计问题了。
【问题讨论】:
-
您使用的是哪个版本的 C# 和 .NET?它在通用方差方面有所不同。顺便说一句,你真的需要这里的所有抽象吗?你会有哪些不同类型的课程和科目?
-
不是 SubjectBase 的重点,因此您可以使用多态性对待所有主题。难道你不能摆脱你的主题覆盖并使用 CourseBase 主题集合吗?
-
@Jon, v4 在这两个方面。我在这里的“规范”是为了迎合“各种事物”,所以我只是在赌尽早获得足够的抽象来支持对基本实体的广泛扩展。
-
@Cosmin,我想你可能有一些我刚刚忽略的东西。谢谢,我去看看。