C # класс организации и списки - PullRequest
3 голосов
/ 02 февраля 2010

Я работаю над приложением на C #, которое состоит из объектов Department, Course и Section. У каждого факультета есть много курсов, и у каждого курса есть много разделов. В настоящее время у меня есть три класса: отдел, курс и отдел. Отдел содержит некоторые свойства, а затем список курсов, который содержит курсы, предлагаемые отделом. Курс содержит некоторые свойства, а затем список разделов, который содержит разделы курса. Это хороший способ структурировать код, или я должен делать это по-другому?

Во-вторых, когда я создаю экземпляр отдела в своем приложении, я устанавливаю некоторые свойства и затем хочу начать добавлять курсы в список курсов, определенных в классе Department. Тем не менее, я, кажется, не могу просто сделать Department.Courses.Add (курс) из приложения. Что я должен делать в классе Department, чтобы я мог добавлять объекты в этот список, не нарушая принцип инкапсуляции?

Пример того, что у меня есть со списком прямо сейчас:

class Department
{

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

однако Department.Courses недоступен в коде программы после создания экземпляра класса (доступны все другие свойства класса).

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

Создание внутреннего списка курсов внутри конструктора без параметров вашего класса.

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, потому что класс List может предоставлять такие методы, как Add и Remove, которые потенциально могут создать недопустимое состояние для вашего родительского класса. Поэтому, если вы решите предоставлять методы для управления внутренними коллекциями, как я предлагал, вы можете представить массив курсов своим клиентам API (помните, что массивы доступны только для чтения), чтобы ваши потребители API не могли создавать побочные эффекты. в классе вашего отдела.

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

Кроме того, вы также можете реализовать интерфейс IEnumerable в своем классе Department. Это позволит вам использовать все методы расширения LINQ, доступные в C # 3.0.

Надеюсь, это поможет, Карлос.

2 голосов
/ 02 февраля 2010

Возможно что-то подобное. Есть несколько способов справиться с этим. зависит от ваших требований.

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 голосов
/ 02 февраля 2010

Вы звучите так, как будто вы на правильном пути. Ваша вторая проблема может быть связана со многими вещами. Это может быть, как говорит Радди, и что вы не создаете список. Возможно также, что ваш список курсов не является общедоступным или вы не создали новый объект курса для добавления.

0 голосов
/ 02 февраля 2010

Что касается вашего второго вопроса - без некоторого кода или более подробной информации это немного сложно - но я сделаю предположение.

Вы, вероятно, на самом деле не создаете список, просто объявляете его

List<xxxx> _variable;

vs

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

Вы должны создать список, чтобы иметь возможность добавить к нему (новый список ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...