列表框无法显示子类变量
作者:互联网
我正在一个项目中,用户正在为动物输入值(名称,年龄,性别等),并且用户输入的值将显示在列表框中
这些类彼此继承.这是继承的工作方式:
Animal class is the parent for all classes.
Mammal class inherit from Animal class.
Dog class inherit from Mammal class.
Cat class inherit from Mammal class
Reptile class inherit from Animal class
Snake class inherit from Reptile class
Lizard class inherit from Reptile class
Animal的变量是id,名称,年龄,性别.
哺乳动物的变量是牙齿
Dog的变量为barkLevel
用户能够选择要创造的动物.有一个显示动物类型(哺乳动物和爬行动物)的列表框,旁边有一个列表框,根据用户选择的动物类型,它会显示其动物.
例如,如果用户在列表框中选择“哺乳动物”,则其旁边的列表框将显示“狗和猫”.
这是完美的工作,这不是问题.
问题:
输入值将显示在结果列表上,而不显示子类变量.结果列表框显示ID,名称,年龄,性别,但不显示牙齿或树皮水平.没有错误消息或任何东西.它只是不显示子类变量.
这是我的MainForm:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Assign_1
{
public partial class MainForm : Form
{
private Dog m_dog = new Dog();
private Cat m_cat = new Cat();
private Snake m_snake = new Snake();
private Lizard m_lizard = new Lizard();
private AnimalManager animalmgr = null;
private Animal m_animal = new Animal();
private Mammal m_mammal = new Mammal();
public MainForm()
{
//Visual Studio initializations
InitializeComponent();
//My initializations
InitializeGUI();
Gendercmb.DataSource = Enum.GetValues(typeof(GenderType));
Categorylst.DataSource = Enum.GetValues(typeof(Categorytype));
animalmgr = new AnimalManager();
}
private void InitializeGUI()
{
ReadInput();
}
private void ReadInput()
{
m_animal.Name = ReadName();
m_animal.Age = ReadAge();
m_mammal.Teeth = ReadTeeth();
m_dog.BarkLevel = ReadBarklevel();
m_animal.Gender = this.Gendercmb.GetItemText(this.Gendercmb.SelectedItem);
}
private int ReadAge()
{
int age = 0;
int.TryParse(Agetxt.Text, out age);
return age;
}
private int ReadBarklevel()
{
int bark = 0;
int.TryParse(barktxt.Text, out bark);
return bark;
}
private int ReadTeeth()
{
int teeth = 0;
int.TryParse(teethtxt.Text, out teeth);
return teeth;
}
private string ReadName()
{
string name = "";
name = Nametxt.Text;
return name;
}
private void addMammal(Mammal values)
{
ReadInput();
switch ((MammalType)Animallst.SelectedIndex)
{
case MammalType.Dog:
{
// Use a copy constructor to set a dog with common data
Dog m_dog = new Dog(values);
// If more data in GUI to fill in for this animal, do it here
//Then send it to the manager for adding to the list
animalmgr.add(m_dog);
break;
}
case MammalType.Cat:
{
Cat m_cat = new Cat(values);
animalmgr.add(m_cat);
break;
}
}
}
private void AddReptile(Reptile values)
{
ReadInput();
switch ((ReptileType)Animallst.SelectedIndex)
{
case ReptileType.Snake:
{
// Use a copy constructor to set a snake with common data
Snake m_snake = new Snake(values);
// If more data in GUI to fill in for this animal, do it here
//Then send it to the manager for adding to the list
animalmgr.add(m_snake);
break;
}
case ReptileType.Lizard:
{
Lizard m_lizard = new Lizard();
animalmgr.add(m_lizard);
break;
}
}
}
//When user clicks "Add to list"
private void button1_Click(object sender, EventArgs e)
{
ReadInput();
System.Windows.Forms.MessageBox.Show(m_dog.BarkLevel.ToString());
switch ((Categorytype)Categorylst.SelectedIndex)
{
case Categorytype.Mammal:
{
Mammal mammal = new Mammal(m_animal);
addMammal(mammal);
break;
}
case Categorytype.Reptile:
{
Reptile m_reptile = new Reptile(m_animal);
AddReptile(m_reptile);
break;
}
}
UpdateResults();
}
private void UpdateResults()
{
Resultlst.Items.Clear(); //Erase current list
//Get one elemnet at a time from manager, and call its
//ToString method for info - send to listbox
for (int index = 0; index < animalmgr.ElementCount; index++)
{
Animal animal = animalmgr.GetElementAtPosition(index);
toString method.
Resultlst.Items.Add(animal.ToString()); // <--- Here is the problem
}
}
}
}
这是我的动物管理员课程:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assign_1
{
class AnimalManager
{
// private List<Animal> m_animalList;
private List<Animal> m_animal;
private List<Mammal> m_mammal;
public AnimalManager()
{
//In this list objects off diff animals of all species are saved
// m_animalList = new List<Animal>();
m_animal = new List<Animal>();
m_mammal = new List<Mammal>();
}
public void add(Animal ObjIn)
{
m_animal.Add(ObjIn);
}
public bool IsIndexValid(int index)
{
return ((index >= 0) && (index < m_animal.Count));
}
public Animal GetElementAtPosition(int index)
{
//We choose to return a copy
if (IsIndexValid(index))
{
if (m_animal[index] is Mammal)
return new Mammal((Mammal)m_animal[index]);
if (m_animal[index] is Reptile)
return new Reptile((Reptile)m_animal[index]);
return null;
}
else
return null;
}
public int ElementCount
{
get { return m_animal.Count; }
}
}
}
更新:
我现在知道问题出在Resultlst.Items.Add(animal.ToString());我不知何故需要包括哺乳动物和狗的物体(取决于所选的动物),但我不知道如何.
解决方法:
据我所知,您实际上从未返回过子类.假设您在m_animal中拥有了所有的猫,狗,蛇和蜥蜴,那么通过基类构造函数运行它们时,实际上实际上是在丢失子类的属性.尝试直接返回对象:
public Animal GetElementAtPosition(int index)
{
if (IsIndexValid(index))
return m_animal[index];
else
return null;
}
如果您在所有类中都覆盖了ToString(),那么您应该得到期望的结果.
标签:visual-studio-2013,c 来源: https://codeday.me/bug/20191120/2044889.html