【问题标题】:Trying to create a list from a multi-propertied abstract class in C#尝试从 C# 中的多属性抽象类创建列表
【发布时间】:2020-04-16 16:48:51
【问题描述】:

如果我有一个名为 Animal 的抽象类,它具有三个属性(名称、年龄和女性),并且我想在一个名为 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 图

【问题讨论】:

    标签: c# list abstract-class


    【解决方案1】:

    我认为您正在尝试将抽象 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();
        }
    

    结果:

    【讨论】:

      【解决方案2】:

      您不应该将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
          }
      
      }
      

      并使用已实例化的ListAnimals 初始化动物园

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-17
        • 2018-08-07
        • 2016-11-10
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2011-07-01
        相关资源
        最近更新 更多