Как заставить колекцию хранить несколько типов ? - 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:
abstract class Animal
{
    protected string Name;
    protected string Breed;
    abstract public void Introduce();
 
    public Animal(string name, string breed)
    {
        this.Name = name;
        this.Breed = breed;
    }
}
 
class Cat : Animal
{
    public override void Introduce()
    {
        Console.WriteLine("I’m {0} of {1}. I’m a cat", Name, Breed);
    }
    public Cat(string name, string breed) : base (name, breed)
    {
        this.Name = name;
        this.Breed = breed;
    }
}
 
class Dog : Animal
{
    public override void Introduce()
    {
        Console.WriteLine("I’m {0} of {1}. I’m a dog", Name, Breed);
    }
    public Dog(string name, string breed) : base (name, breed)
    {
        this.Name = name;
        this.Breed = breed;
    }
}
Теперь проблема, я никогда не работал с колекциями и обобщениями, хотя имею представления что это и зачем. Так вот, проблема для меня, как запхать два разных типа в одну колекцию. Пробовал написать:
class PetShop
{
    private List<Animal> petCollection;
    public void AddPet(Animal animal)
    {
        petCollection.Add(animal);
    }
    public void IntroduceAll()
    {
        foreach(var a in petCollection)
        {
            a.Introduce();
        }
    }
}
Но при работе я получаю ошибку приведения:
        static void Main(string[] args)
        {
            PetShop petShop = new PetShop();
            petShop.AddPet(new Cat("Cat1", "BreedCat1"));
            petShop.AddPet(new Cat("Cat2", "BreedCat2"));
            petShop.AddPet(new Cat("Cat3", "BreedCat3"));
            petShop.AddPet(new Dog("Dog1", "BreedDog1"));
            petShop.AddPet(new Dog("Dog2", "BreedDog2"));
            petShop.AddPet(new Dog("Dog3", "BreedDog3"));
 
            petShop.IntroduceAll();
        }
Как правильно сделать так, что б PetShop мог хранить одновременно экземпляри двух типов - Cat и Dog ?

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

textual
Листинг программы
class PetShop
{
    private List<Animal> petCollection;
 
    public PetShop()
    {
        petCollection = new List<Animal>();
    }
    public void AddPet(Animal animal)
    {
        petCollection.Add(animal);
    }
    public void IntroduceAll()
    {
        foreach(var a in petCollection)
        {
            a.Introduce();
        }
    }
}

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


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

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

13   голосов , оценка 3.923 из 5
Похожие ответы