2011-01-19 2 views
5

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

Просто для того, чтобы иметь класс 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

Когда вы говорите «могут быть несколько собак», вы имеете в виду «несколько экземпляров класса« Собака »или« несколько видов собак »? – yasouser

+0

извините, несколько экземпляров класса dog – Spooks

ответ

5

Самый простой способ сделать список собак:

List<Dog>

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

public class DogList : List<Dog>

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

UPDATE:

Вы, как правило, не нужно создавать специальный класс списка при использовании 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>.

+0

Я знаю, как составить список собак, я просто не знаю, где это сделать, чтобы он был доступен для любого класса в проекте. Мне понадобится метод для создания списка, если это будет в своем классе или внутри класса собаки. – Spooks

+1

. Общие списки удобны, потому что вам не нужно объявлять их повсеместно. В моих проектах, когда мне нужен список чего-то (Invoices, Users, whatever), я выставляю свойство или метод из списка , где T - тип, который я хочу вернуть. Если у вас есть служба, которая возвращает список собак, сделайте метод return List . Если у вас есть ViewModel, который поддерживает представление со списком или сеткой, полной собак, создайте свойство или введите List и привяжите элемент управления к этому свойству. –

+1

PS. Единственное требование здесь состоит в том, что ваш проект имеет ссылку на тип «T», независимо от того, какой тип вы хотите внести в список. Затем вы можете использовать общие списки для инкапсуляции этого типа, и вы получаете все функциональные возможности, входящие в список (Добавить, Вставить, Удалить и т. Д.) –

3

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

+0

Собака-фабрика? означает ли это класс вне класса собаки? – Spooks

+0

Не обязательно, это может быть статический метод класса Dog. – Tesserex

1

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

Это решение будет работать в однопоточном приложении, но оно предоставит вам all the dangers of global variables.

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

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

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

+0

Отлично, очень хорошо сказано. Я не думал, что это имеет смысл. Вы можете посмотреть, как я, наконец, сделал это выше (очевидно, на самом деле не использовал собак, и немного упростил) – Spooks