簡體   English   中英

我應該如何抽象另一個對象擁有的對象集合?

[英]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的角度來看,我確定我遺漏了一些非常明顯的東西,但我能看到的唯一解決方案是:

  1. 完全省略抽象基礎中的主題,並僅向派生類添加特定類型的集合屬性。
  2. 在抽象基礎中實現諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM