[英]How should I abstract a collection of objects owned by another object?
在一個管理職業培訓的系統中,我有一個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
之類的接口以及具體類。 請原諒我的朦朧,這已經有一段時間了,因為我很高興遇到這樣的設計問題。
為什么不引入通用接口來抽象課程呢? 對不起,如果我錯過了明顯的事
public interface ICourse<TSubject>
{
IEnumerable<TSubject> Subjects { get; }
}
public abstract class CourseBase<TSubject>
: BaseObject,
ICourse<TSubject>
{
public IEnumerable<TSubject> Subjects
{
get { return new List<TSubject>(); }
}
}
public class LocalCourse
: CourseBase<LocalCourseSubject>
{
}
如果Subject是Course實體的重要部分,你應該將它保存在ICourse和CourseBase中,否則我會建議通過ISubjectAware接口來抽象它
你能不能這樣做:
public abstract class CourseBase<T> where T : SubjectBase
{
public virtual IEnumerable<T> Subjects
{
get { return new List<T>(); }
}
}
public abstract class SubjectBase
{
public string Name { get; set; }
public string Description { get; set; }
public int ValidityPeriod { get; set; }
}
public class LocalCourse : CourseBase<LocalCourseSubject>
{
public override IEnumerable<LocalCourseSubject> Subjects
{
get { throw new NotImplementedException(); }
}
}
我認為,無論如何,這將實現您的短期目標,假設一般模式是每個CourseBase繼承者將擁有相同類型的SubjectBase繼承者的集合。 但是,如果是這種情況,這似乎是一個並行的繼承層次結構,有時可能是代碼氣味(不是說它必然是 - 我不知道你正在建模的域的所有細節)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.