C#班级组织和名单
我正在开发一个C#应用程序,它由目标部门、课程和部门组成。每个系都有许多课程,每个课程都有许多部分。目前我有三个班:系、科和组。Department包含一些属性,然后列出课程,其中包含Department提供的课程。课程包含一些属性,然后列出部分,其中包含课程的部分。这是一种结构化代码的好方法,还是我应该用另一种方法 其次,当我在应用程序中实例化一个部门时,我设置了一些属性,然后开始将课程添加到department类中定义的课程列表中。然而,我似乎无法简单地从应用程序中添加Department.Courses.Add(课程)。我必须在Department类中做什么才能在不违反封装原则的情况下向该列表添加对象 我现在在列表中看到的一个例子是:C#班级组织和名单,c#,oop,list,C#,Oop,List,我正在开发一个C#应用程序,它由目标部门、课程和部门组成。每个系都有许多课程,每个课程都有许多部分。目前我有三个班:系、科和组。Department包含一些属性,然后列出课程,其中包含Department提供的课程。课程包含一些属性,然后列出部分,其中包含课程的部分。这是一种结构化代码的好方法,还是我应该用另一种方法 其次,当我在应用程序中实例化一个部门时,我设置了一些属性,然后开始将课程添加到department类中定义的课程列表中。然而,我似乎无法简单地从应用程序中添加Department.
class Department
{
// ......
List<Course> Courses = new List<Course>;
}
班级部门
{
// ......
列表课程=新列表;
}
但是,在类被实例化后,课程代码中没有Department.Courses(课程的所有其他属性都可用)。至于你的第二个问题——没有一些代码或更多细节,这有点难——但我猜一下 您可能不是在实际创建列表,而是在声明它
List<xxxx> _variable;
vs
List<xxxx> _variable = new List<xxxxx>();
List\u变量;
vs
列表_变量=新列表();
您必须创建一个列表才能添加到其中(new list()) 可能是类似的。有几种方法可以解决这个问题。这取决于你的要求
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);
}
}
公共课部
{
//初始化默认构造函数中的列表
公共部门()
{courses=新列表();}
//通过在外部声明并使用Dpartment初始化传递来初始化列表
公共部门(课程表)
{课程=_课程;}
列出课程;
公开名单课程
{
得到
{
if(courses==null)
返回新列表();
其他返回课程;
}
设置{courses=value;}
}
内部bool AddCourseToCourses(课程)
{
bool isAdded=false;
//这里的支票怎么样
如果(!courses.Contains(_courses))
{
课程。添加(_课程);
isAdded=真;
}
添加了返回;
}
}
公共课
{
公共课程(列出科目)
{subject=_subject;}
列出主题;
公开科目表
{
获取{返回主题;}
设置{subjects=value;}
}
}
//我不明白你所说的课程“部分”是什么意思,非常笼统。
//改为使用主题,根据您的想法进行更改
公共课科目
{
字符串名;
公共字符串名
{
获取{返回名称;}
设置{name=value;}
}
整数小时;
公共积分小时数
{
获取{return creditHours;}
设置{creditHours=value;}
}
公共主题(字符串名称,整数小时)
{
名称=_名称;
creditHours=_creditHours;
}
}
公共类TestClass
{
公共无效剂量测定法()
{
//科目
受试者SubC1=新受试者(“C#”,10);
主题主题2=新主题(“.Net”,10);
//科目表
List advancedPrSubjects=新列表();
高级主题。添加(主题1);
高级主题。添加(主题2);
//课程
课程进阶编程=新课程(进阶主题);
//提交将课程添加到部门类本身的权限
部门=新部门();
部门附加课程(高级编程);
}
}
有更好的方法可以做到这一点。看看这些教程,以获得更好的洞察力
- 希望能有帮助
也可能是您的课程列表不是公共的,或者您没有实例化要添加的新课程对象。在类的无参数构造函数中实例化内部课程列表
private List<Course> _coursesList;
public Department()
{
_coursesList = new List<Course>();
}
我认为在您的情况下,直接公开列表不是一个好主意,因为类列表可能提供诸如Add和Remove之类的方法,这可能会在父类上创建无效状态。因此,如果您选择像我建议的那样公开方法来操作内部集合,那么您可以向API客户机公开一个课程数组(记住这些数组是只读的),这样您的API使用者就不会对您的department类产生副作用
public Course[] Courses {
get { return _coursesList.ToArray(); }
}
此外,还可以在Department类上实现IEnumerable接口。它将使您能够利用C#3.0中提供的所有LINQ扩展方法
我希望有帮助,
Carlos。尝试将课程对象添加到列表时会出现什么错误?这将在每次访问课程对象时创建一个新列表。。。可能不是你所期望的,因为它从未保存回成员变量。Ruddy-我想我明白你的意思了…你对如何避免这种情况有什么建议吗?是的,在构建过程中删除空检查并实例化列表。当你控制状态时,没有理由使事情过于复杂。另外,您可能想要返回ICollection或IList,并且您可能想要一起摆脱setter。@andrew。取决于我认为的使用模型,但我猜您实际上可能不需要as“set”-只需要Get来返回courses成员变量,如果为null,则将其设置为new
Get{if(courses=null)courses=new List();return course;}
EDIT:我不确定
public Course[] Courses {
get { return _coursesList.ToArray(); }
}