Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何提取另一个对象所拥有的对象集合?_C#_.net_Oop_Ooad - Fatal编程技术网

C# 我应该如何提取另一个对象所拥有的对象集合?

C# 我应该如何提取另一个对象所拥有的对象集合?,c#,.net,oop,ooad,C#,.net,Oop,Ooad,在一个管理职业培训的系统中,我有一个CourseBase抽象类,我决定使用它来支持ICourse接口,因为我更愿意避免重复从假设的基础课程实体派生的所有类的实现代码。每门课程都有一个主题列表,任何主题都由SubjectBase抽象类定义。所以,我有 public abstract class CourseBase : BaseObject { public IEnumerable<SubjectBase> Subjects { get { return

在一个管理职业培训的系统中,我有一个
CourseBase
抽象类,我决定使用它来支持
ICourse
接口,因为我更愿意避免重复从假设的基础
课程
实体派生的所有类的实现代码。每门课程都有一个主题列表,任何主题都由
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; }
}
我确信,从面向对象的角度来看,我遗漏了一些非常明显的东西,但我能看到的唯一解决方案是:

  • 从抽象库中完全省略主题,只向派生类添加特定类型的集合属性
  • 在抽象库和具体类中实现一个接口,如
    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>
    {
    }
    
    公共接口ICourse
    {
    IEnumerable主题{get;}
    }
    公共抽象类课程库
    :BaseObject,
    伊库斯
    {
    公共可数科目
    {
    获取{返回新列表();}
    }   
    }
    公共课程
    :CourseBase
    {
    }
    

    如果主题是课程实体的重要组成部分,那么您应该将其同时保存在ICourse和CourseBase中,否则我建议CTS通过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(); }
        }
    }
    
    公共抽象类课程库,其中T:SubjectBase
    {
    公共虚拟可数主体
    {
    获取{返回新列表();}
    }
    }
    公共抽象类主题库
    {
    公共字符串名称{get;set;}
    公共字符串说明{get;set;}
    public int ValidityPeriod{get;set;}
    }
    公共课程:课程库
    {
    公共可数主题
    {
    获取{抛出新的NotImplementedException();}
    }
    }
    

    我认为这至少可以实现您的短期目标,假设一般模式是每个CourseBase继承器都有一个相同类型的SubjectBase继承器集合。但是,如果是这样的话,这看起来像是一个并行继承层次结构,有时可能是一种代码味道(不是说它一定是——我不知道您正在建模的域的所有细节)。

    您使用的是哪个版本的C#和.NET?它在通用方差方面产生了差异。顺便问一下,你真的需要这里所有的抽象吗?你会有什么不同类型的课程和科目?主题库的目的不是让你可以使用多态性来对待所有科目。难道你就不能摆脱你的科目覆盖,转而使用课程库中的科目集合吗?@Jon,v4。我在这里的“规范”是为了迎合“各种各样的东西”,所以我只是在赌尽早获得足够的抽象来支持对基本实体的广泛扩展。@Cosmin,我想你可能有一些东西,我刚才忽略了。谢谢,我去看看。我觉得这是个坏主意@上面的科斯曼有正确的想法。像这样使用泛型将破坏多态性,您将无法以泛型方式处理主题集合。我不确定我是否正确-
    您将无法以泛型方式处理主题集合
    ,请您举个例子好吗?如果这是在.Net-4.0之前,我将能够给您举个例子。但我现在刚刚接受了协方差方面的培训,可以做“IEnumerable objs=new List();”之类的事情。这很有趣,可能会改变我未来的对象模型设计。很抱歉这么吵。我正在建模的域名的所有者似乎对细节不太清楚,但谢谢,这是一个不错的候选人。如果在某种程度上有所帮助,我很高兴。:)
    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(); }
        }
    }