C#类组织和列表

时间:2010-02-02 13:43:21

标签: c# oop list

我正在开发一个C#应用程序,它由对象Department,Course和Section组成。每个部门都有很多课程,每个课程都有很多部分。目前我有三个班:部门,课程和科。部门包含一些属性,然后是列表课程,其中包含部门提供的课程。课程包含一些属性,然后是列表部分,其中包含课程的各个部分。这是使代码结构化的好方法还是我应该采用不同的方式?

其次,当我在我的应用程序中实例化一个部门时,我设置了一些属性,然后想开始向Department类中定义的List Courses添加课程。但是,我似乎无法简单地从应用程序中执行Department.Courses.Add(Course)。我必须在Department类中做什么才能在不违反封装原则的情况下将对象添加到该列表中?

我现在对列表的一个例子是:

class Department
{

     // ......
     List<Course> Courses = new List<Course>;
}

然而,在实例化类之后,程序代码中没有Department.Courses(该类的所有其他属性都可用)。

4 个答案:

答案 0 :(得分:3)

在类的无参数构造函数中实例化内部课程列表。

private List<Course> _coursesList;

public Department()
{
    _coursesList = new List<Course>();
}

另外,确保封装的另一种方法是在Department类上提供一个方法来向其添加课程,而不是直接公开课程列表。像

这样的东西
public void AddCourse(Course c) { ... }

// or (adding the feature of doing the method calls in a composable way)
public Course AddCourse(Course c) { ... }

// or 
public void AddCource(String name, etc) { ... }

我认为在你的情况下直接暴露List并不是一个好主意,因为类List可能会提供类似Add和Remove的方法,这可能会在你的父类上创建一个无效状态。因此,如果您选择公开方法来操作我建议的内部集合,您可以向您的API客户端公开一系列课程(请记住这些数组是只读的),这样您的API使用者将无法创建副作用在你的部门课上。

public Course[] Courses {
    get { return _coursesList.ToArray(); }
}

此外,您还可以在Department类上实现IEnumerable接口。它将使您能够利用C#3.0中提供的所有LINQ扩展方法。

我希望它有所帮助, 卡洛斯。

答案 1 :(得分:2)

可能类似的东西。有几种方法可以解决这个问题。取决于你的要求。

public class Department
{
    // Initialize the list inside Default Constructor
    public Department()
    {            courses = new List<Course>();        }

    // Initialize List By Declaring outside and Passing with Dpartment Initilization
    public Department(List<Course> _courses)
    {            courses = _courses;        }

    List<Course> courses;
    public List<Course> Courses
    {
        get
        {
            if (courses == null)
                return new List<Course>();
            else return courses;
        }
        set { courses = value; }
    }
    internal bool AddCourseToCourses(Course _course)
    {
        bool isAdded = false;
        // DoSomeChecks here like
        if (!courses.Contains(_course))
        {
            courses.Add(_course);
            isAdded = true;
        }
        return isAdded;
    }
}    

public class Course
{
    public Course(List<Subject> _subject)
    {            subjects = _subject;        }

    List<Subject> subjects;  
    public List<Subject> Subjects
    {
        get { return subjects; }
        set { subjects = value; }
    }
}

// I do not get what do you mean by course "section", very general.
// used Subject instead, Change as you want just to give an idea
public class Subject
{
    string name;    
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    int creditHours;    
    public int CreditHours
    {
        get { return creditHours; }
        set { creditHours = value; }
    }
    public Subject(string _name, int _creditHours)
    {
        name = _name;
        creditHours = _creditHours;
    }
}
public class TestClass
{
    public void DoSomething()
    {  
        // Subjects
        Subject subj1 = new Subject("C#", 10);
        Subject subj2 = new Subject(".Net", 10);

        // List of Subjects
        List<Subject> advancedPrSubjects = new List<Subject>();
        advancedPrSubjects.Add(subj1);
        advancedPrSubjects.Add(subj2);

        // Course
        Course advancedProgramming = new Course(advancedPrSubjects);            


        // Deliver authoroty to add Course to Department Class itself
        Department dept = new Department();
        dept.AddCourseToCourses(advancedProgramming);
    }
}

有更好的方法可以做到这一点。看看这些教程以获得更好的洞察力

答案 2 :(得分:0)

关于你的第二个问题 - 没有一些代码或更多细节有点难 - 但我会猜测。

你可能实际上并没有创建列表,只是声明它

List<xxxx> _variable;

vs

List<xxxx> _variable = new List<xxxxx>();

您必须创建一个能够添加到其中的列表(new List());

答案 3 :(得分:0)

你听起来好像在正确的轨道上。 你的第二个问题可能是很多事情。 可能就像Ruddy说的那样,你没有创建列表。 也可能是您的课程列表不公开,或者您没有实例化要添加的新课程对象。