Как заставить колекцию хранить несколько типов ? - C#

Узнай цену своей работы

Формулировка задачи:

Здраствуйте, есть учебное задание (даю оригинал на английском):
Create next classes: Cat, Dog and Petshop. Types Cat and Dog have fields Name and Breed and method Introduce() which prints text “I’m (Name) of (Breed). I’m a cat (or dog)”. The class Petshop collects in its container different pets. We may add new pet to container by method AddPet() and we may display information about all pets by method IntroduceAll(). Which hierarchy of classes is the best solution of this problem? Write short code to demonstrate your solution. Your code should include class (interface) aggregation, inheritance, should use .NET BCL collections or generics, should implement exception handling.
Написал такой код, который реализует классы Cat и Dog:
Листинг программы
  1. abstract class Animal
  2. {
  3. protected string Name;
  4. protected string Breed;
  5. abstract public void Introduce();
  6. public Animal(string name, string breed)
  7. {
  8. this.Name = name;
  9. this.Breed = breed;
  10. }
  11. }
  12. class Cat : Animal
  13. {
  14. public override void Introduce()
  15. {
  16. Console.WriteLine("I’m {0} of {1}. I’m a cat", Name, Breed);
  17. }
  18. public Cat(string name, string breed) : base (name, breed)
  19. {
  20. this.Name = name;
  21. this.Breed = breed;
  22. }
  23. }
  24. class Dog : Animal
  25. {
  26. public override void Introduce()
  27. {
  28. Console.WriteLine("I’m {0} of {1}. I’m a dog", Name, Breed);
  29. }
  30. public Dog(string name, string breed) : base (name, breed)
  31. {
  32. this.Name = name;
  33. this.Breed = breed;
  34. }
  35. }
Теперь проблема, я никогда не работал с колекциями и обобщениями, хотя имею представления что это и зачем. Так вот, проблема для меня, как запхать два разных типа в одну колекцию. Пробовал написать:
Листинг программы
  1. class PetShop
  2. {
  3. private List<Animal> petCollection;
  4. public void AddPet(Animal animal)
  5. {
  6. petCollection.Add(animal);
  7. }
  8. public void IntroduceAll()
  9. {
  10. foreach(var a in petCollection)
  11. {
  12. a.Introduce();
  13. }
  14. }
  15. }
Но при работе я получаю ошибку приведения:
Листинг программы
  1. static void Main(string[] args)
  2. {
  3. PetShop petShop = new PetShop();
  4. petShop.AddPet(new Cat("Cat1", "BreedCat1"));
  5. petShop.AddPet(new Cat("Cat2", "BreedCat2"));
  6. petShop.AddPet(new Cat("Cat3", "BreedCat3"));
  7. petShop.AddPet(new Dog("Dog1", "BreedDog1"));
  8. petShop.AddPet(new Dog("Dog2", "BreedDog2"));
  9. petShop.AddPet(new Dog("Dog3", "BreedDog3"));
  10. petShop.IntroduceAll();
  11. }
Как правильно сделать так, что б PetShop мог хранить одновременно экземпляри двух типов - Cat и Dog ?

Решение задачи: «Как заставить колекцию хранить несколько типов ?»

textual
Листинг программы
  1. class PetShop
  2. {
  3.     private List<Animal> petCollection;
  4.  
  5.     public PetShop()
  6.     {
  7.         petCollection = new List<Animal>();
  8.     }
  9.     public void AddPet(Animal animal)
  10.     {
  11.         petCollection.Add(animal);
  12.     }
  13.     public void IntroduceAll()
  14.     {
  15.         foreach(var a in petCollection)
  16.         {
  17.             a.Introduce();
  18.         }
  19.     }
  20. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы