2010-02-02 2 views
3

저는 Department, Course 및 Section 개체로 구성된 C# 응용 프로그램을 만들고 있습니다. 각학과에는 많은 코스가 있으며, 각 코스에는 많은 섹션이 있습니다. 현재 저는학과, 코스 및 섹션의 세 가지 수업을 운영하고 있습니다. Department에는 몇 가지 속성이 포함되어 있으며 목록 코스에는 부서에서 제공하는 코스가 포함되어 있습니다. 과정에는 몇 가지 속성이 포함되어 있으며 과정의 섹션이 포함 된 목록 섹션이 있습니다. 코드를 구조화하는 좋은 방법입니까 아니면 다른 방식으로해야합니까?C# 클래스 조직 및 목록

두 번째로 응용 프로그램에서 부서를 인스턴스화 할 때 몇 가지 속성을 설정 한 다음 Department 클래스에 정의 된 List Courses에 코스를 추가하기 시작합니다. 그러나, 나는 단순히 부서를 할 수없는 것 같습니다. 코스. 신청서 (코스)를 추가하십시오. 내가 캡슐화의 원칙을 깨지 않으면 서 그 목록에 객체를 추가 할 수 있도록 Department 클래스 내에서 무엇을해야합니까?

내가 지금 목록을 가지고있는의 예는 다음과 같습니다 클래스가 인스턴스화 된 후에 그러나 Department.Courses는 프로그램 코드에서 사용할 수 없습니다

class Department 
{ 

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

(클래스의 다른 모든 속성을 사용할 수 있습니다).

+0

Course 객체를 목록에 추가 할 때 어떤 오류가 발생합니까? –

답변

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) { ... } 

처럼 뭔가, 같은 방법을 제공 추가 할 수 잠재적으로 상위 클래스에 유효하지 않은 상태를 생성하는 제거 할 수 클래스 목록 때문에 목록을 제공합니다. 따라서 내가 제안한 것처럼 내부 컬렉션을 조작하기위한 메소드를 노출하기로 선택했다면 API 클라이언트가 코스 클라이언트를 API 클라이언트에 공개 할 수 있습니다 (배열은 읽기 전용이므로 API 클라이언트는 부작용을 만들 수 없습니다). 학급 수업에

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

또한 Department 클래스에 IEnumerable 인터페이스를 구현할 수도 있습니다. C# 3.0에서 사용할 수있는 모든 LINQ 확장 메서드를 활용할 수 있습니다.

도움이 되었기를 바랍니다. 카를로스.

+0

+1입니다. – ChrisBD

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

이렇게하는 더 좋은 방법이 있습니다. 더 나은 통찰력이 자습서를 보라 http://www.functionx.com/csharp/index.htm

http://www.csharp-station.com/Tutorials/Lesson07.aspx

    • 은 당신이 올바른 궤도에있어 것처럼 당신은 소리

  • +0

    감사합니다. – Andrew

    +0

    이렇게하면 액세스 할 때마다 새 List 이 생성 될 것입니다. 아마 멤버 변수에 다시 저장되지 않았으므로 예상 한 것과 다를 수 있습니다. – Ruddy

    +0

    붉게 - 나는 당신이 의미하는 바를 본 것 같아요 ... 이것을 피하는 방법에 대한 제안이 있습니까? – Andrew

    0

    도움이되기를 바랍니다. 두 번째 문제는 여러 가지 일 수 있습니다. Ruddy가 말했듯이 목록을 작성하지 않을 수도 있습니다. 코스 목록이 공개되지 않았거나 추가 할 새로운 코스 객체를 인스턴스화하지 않았을 수도 있습니다.