我正在开发一个C#应用程序,它由对象Department,Course和Section组成。每个部门都有很多课程,每个课程都有很多部分。目前我有三个班:部门,课程和科。部门包含一些属性,然后是列表课程,其中包含部门提供的课程。课程包含一些属性,然后是列表部分,其中包含课程的各个部分。这是使代码结构化的好方法还是我应该采用不同的方式?
其次,当我在我的应用程序中实例化一个部门时,我设置了一些属性,然后想开始向Department类中定义的List Courses添加课程。但是,我似乎无法简单地从应用程序中执行Department.Courses.Add(Course)。我必须在Department类中做什么才能在不违反封装原则的情况下将对象添加到该列表中?
我现在对列表的一个例子是:
class Department
{
// ......
List<Course> Courses = new List<Course>;
}
然而,在实例化类之后,程序代码中没有Department.Courses(该类的所有其他属性都可用)。
答案 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说的那样,你没有创建列表。 也可能是您的课程列表不公开,或者您没有实例化要添加的新课程对象。