Попытка создать список из многофункционального абстрактного класса в C# - PullRequest
0 голосов
/ 16 апреля 2020

Если у меня есть абстрактный класс с именем Animal с тремя свойствами (Name, Age и Female), и я хочу составить список животных в методе класса с именем Zoo, сделав каждый экземпляр в списке различным Animal как бы я это сделал? Ниже также приведен мой код:

using System;
using System.Collections.Generic;

public abstract class Animal
{
    abstract public string AName();
    abstract public int Age();
    abstract public bool Female();
}

public class Zoo : Animal
{
    public string ZName;
    public string City;
    public int Capacity;
    public List<Animal> Animals = new List<Animal>();

    public Zoo(string name, string city, int capacity)
    {
        ZName = name;
        City = city;
        Capacity = capacity;
    }

    public void addAnimal(Animal animal)
    {
        List<Animal>.Add(animal.Age(), animal.AName(), animal.Female());
    }

Это диаграмма UML, с которой мне нужно работать

This is the UML Diagram I have to work off of

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Я думаю, что вы пытаетесь использовать абстрактный класс Animal неправильно. Похоже, вы пытаетесь сделать что-то более похожее на это:

public class Zoo
{
    public string ZName;
    public string City;
    public int Capacity;
    public List<Animal> Animals = new List<Animal>();

    public Zoo(string name, string city, int capacity)
    {
        ZName = name;
        City = city;
        Capacity = capacity;
    }

    public void addAnimal(Animal animal)
    {
        Animals.Add(animal);
    }
}

public abstract class Animal
{
    public abstract string AName { get; set; }
    public abstract int Age { get; set; }
    public abstract bool Female { get; set; }
}

public class Tiger : Animal
{
    public override string AName { get; set; }
    public override int Age { get; set; }
    public override bool Female { get; set; }
}

public class Lion : Animal
{
    public override string AName { get; set; }
    public override int Age { get; set; }
    public override bool Female { get; set; }
}

Я создал небольшое консольное приложение, чтобы продемонстрировать это, используя классы выше:

    static void Main(string[] args)
    {
        var myZoo = new Zoo("Fun Zoo", "New York", 20);
        myZoo.addAnimal(new Tiger { Age = 10, AName = "Frank", Female = true });
        myZoo.addAnimal(new Lion { Age = 11, AName = "Fred", Female = false });

        Console.WriteLine("Here's the new zoo:");
        Console.WriteLine("Zoo Name: " + myZoo.ZName + ", City: " + myZoo.City + ", Capacity: " + myZoo.Capacity);
        Console.WriteLine();
        Console.WriteLine("Animals at the zoo:");
        foreach (var a in myZoo.Animals)
        {
            Console.WriteLine("Name: " + a.AName + ", Age: " + a.Age + ", Is Female: " + a.Female);
        }

        Console.ReadLine();
    }

Результаты:

enter image description here

1 голос
/ 16 апреля 2020

Вы не должны расширять Animal с помощью Zoo, я думаю, вы хотите что-то более похожее на:

public class Zoo {
    public string ZName;
    public string City;
    public int Capacity;
    public List<Animal> Animals = new List<Animal>();

    public Zoo(string name, string city, int capacity, List<Animal> animals)
    {
        ZName = name;
        City = city;
        Capacity = capacity;
        Animals = animals
    }

}

и инициализировать зоопарк с уже созданным List из Animal s.

...