2010-02-02 66 views
3

我正在研究一个由对象部门,课程和部分组成的C#应用​​程序。每个部门都有很多课程,每个课程都有很多部分。目前我有三个班级:部门,课程和部门。部门包含一些属性,然后包含列表课程,其中包含部门提供的课程。课程包含一些属性,然后包含一个列表部分,其中包含课程的各个部分。这是让代码结构化还是我应该以不同方式完成的好方法?其次,当我在应用程序中实例化一个部门时,我设置了一些属性,然后想要开始将课程添加到Department类中定义的列表课程中。但是,我似乎无法简单地从应用程序中执行Department.Courses.Add(Course)。我必须在Department类中做什么,以便我可以在不破坏封装原则的情况下将对象添加到该列表中?C#类的组织和列表

什么,我现在有列表中的一个例子是:

class Department 
{ 

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

类实例化后然而Department.Courses是不是在程序代码中(类的所有其他属性都可以)。

+0

尝试将课程对象添加到列表时出现什么错误? – 2010-02-02 13:49:55

回答

3

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

private List<Course> _coursesList; 

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

此外,另一种方式来确保封装是提供您的系类中的方法,以课程添加到它,而不是直接暴露出的课程表。喜欢的东西

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,可以提供类似的方法,添加和删除这有可能造成对你的父类的无效状态。因此,如果您选择按照我的建议公开方法来操纵内部集合,那么您可以向API客户端公开一系列课程(请记住这些数组是只读的),因此您的API使用者将无法使用创建的副作用在你的部门班上。

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

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

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

+0

+1为最完整的答案。 – ChrisBD 2010-02-02 14:24:00

0

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

你可能不实际创建列表,只是宣称它

List<xxxx> _variable; 

vs 

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

您必须创建一个列表,可以添加到它(新名单());

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); 
    } 
} 

有更好的方法来做到这一点。看看这些教程为更好地了解

+0

谢谢,就是这样! – Andrew 2010-02-02 13:56:21

+0

这将创建一个新的列表每次访问...可能不是你所期望的,因为它从来没有保存回成员变量。 – Ruddy 2010-02-02 13:56:29

+0

Ruddy-我想我明白你的意思了......你对如何避免这个问题有什么建议吗? – Andrew 2010-02-02 13:59:07

0

,您是在正确的轨道上你的声音。 你的第二个问题可能归结为许多事情。 这可能是Ruddy说的,而你并没有创建这个列表。 也可能是因为您的课程列表不公开,或者您没有实例化要添加的新课程对象。