Структура класса для списка Класс? - PullRequest
6 голосов
/ 19 января 2011

Я ищу помощь по структуре классов.Допустим, у меня есть класс с именем Dog, который хранит информацию о собаке (имя, вес, тип), но, поскольку может быть несколько собак, я также хотел бы, чтобы класс содержал всех этих собак для использования на протяжении всего моего проекта.Каков наилучший способ сделать это?

Просто иметь класс DogList, который сохраняет информацию о классе Dog в открытый список?Позволить мне получить его по желанию?

Или список должен быть статическим в исходном классе собаки?может быть, в конструкторе, каждый раз, когда кто-то создает новую собаку, собаку помещают в статический список?

Редактировать: Извините, вопрос был немного пропущен.лучший способ реализации.

public class Dog
{
    public string name{get;set;}
    public int weight { get; set; }
}

public class DogFactory //not sure if thats the correct wording
{
    public List<dog> lstDogs = new List<dog>();
    public void setDogs()
    {
    Animal.Retrieve("Dog"); 
    //will retrieve a list of all dogs, with details, though this is costly to use
        foreach(Animal.Dog pet in Animal._Dogs)
        {
            Dog doggie = new doggie();
            doggie.Name = pet.Name;
            ...etc
            lstDog.add(doggie);
        }
    }
}

Ответы [ 3 ]

5 голосов
/ 19 января 2011

Самый простой способ составить список собак:

List<Dog>

Это строго типизированный список собак, использующий класс List<T> из System.Collections.Generic.,Вы можете сделать класс этого:

public class DogList : List<Dog>

Хотя это обычно не требуется, если вы не хотите добавлять свойства специально к списку собак, а не ксами собаки.

ОБНОВЛЕНИЕ:

При использовании List<T> обычно вам не нужно создавать отдельный класс списка.В большинстве случаев вы можете сделать это:

public class DogService
{
    public List<Dog> GetAllDogs()
    {
        var r = new Repository(); // Your data repository
        return r.Dogs.ToList();   // assuming your repository exposes a 'Dogs query'
    }
}

Если вы используете LINQ для получения ваших данных, вы можете использовать расширение ToList (), чтобы вернуть List<T>, поэтому нет необходимости создаватькласс, производный от List<T>.

3 голосов
/ 19 января 2011

Что ж, в C # уже есть очень хороший класс List<>, поэтому, если у вас нет особых потребностей, я бы не стал использовать новый класс DogList. Если вам нужно отслеживать всех созданных собак, то статический список внутри класса собак подойдет. Просто убедитесь, что он хранится private, и у вас есть методы для добавления или получения собак. Более того, ваша фабрика собак может добавить их в список для вас (который, как я вижу, вы упомянули сами).

1 голос
/ 19 января 2011

Или список должен быть статическим внутри оригинальный класс собаки? может быть в конструктор, каждый раз, когда кто-то создает новая собака, собака попадает в статический список?

Это решение будет работать в однопоточном приложении, но оно подвергнет вас всем опасностям глобальных переменных .

Это также была бы плохая абстракция *: когда было бы целесообразно, чтобы класс Dog содержал список всех собак, которые какой-либо вызывающий собрал во время выполнения? Что должно произойти, если вызывающая сторона выделяет экземпляр Dog?

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

* Если в списке нет журнала регистрации созданных собак.

...