【发布时间】:2017-04-13 12:14:30
【问题描述】:
这个问题有半个答案,我已经彻底阅读过,以及 MSDN 关于泛型类的所有内容,但是当泛型类从另一个类继承时我仍然遇到问题:where T: ClassName
例如,这是我的通用列表类
public class MyGenericList2<T> where T : Person
{
private T[] list;
public MyGenericList2(int size)
{
list = new T[size];
}
public T getItem(int index)
{
T temp = default(T);
temp = list[index];
return temp;
}
public void setItem(int index, T value)
{
list[index] = value;
}
public void DisplayList()
{
for (int i = 0; i < list.Length; i++)
{
Console.Out.WriteLine(list[i]);
}
}
}
它继承自 person 类: 注意:为了清楚起见,它被缩短了
public abstract class Person
{
protected string firstName;
// Getters
public string getFirstName()
{
return this.firstName;
}
public void setFirstName(string fname)
{
this.firstName = fname;
}
}
当我尝试调用它时,我收到一个关于尝试将字符串转换为 {namespace}.Person 的错误,因为我试图将字符串放入“Person”框中,但是如何使用这种机制调用类吗?
这里是主要方法
public static void Main(string[] args)
{
MyGenericList2<Person> studentGeneric = new MyGenericList2<Person>(3);
Student st1 = new Student();
st1.setFirstName("Thor");
studentGeneric.setItem(0, st1); //This does not work
studentGeneric.setItem(1, Person.setFirstName("Odin"); // Does not work
studentGeneric.setItem(2, st1.setFirstName("Slepnir"); // Does not work
studentGeneric.DisplayList();
Console.ReadLine();
}
如果我剪掉Where T : Person 并使用GenericList2<string>,它可以正常工作,这是有道理的,因为它是字符串到字符串的。
任何帮助将不胜感激
快速澄清 Student 从 Person 继承:
public class Student : Person
{
// Student 1
private string studentID01 = "001";
public string getStudentID01()
{
return this.studentID01;
}
}
【问题讨论】:
-
学生是否从人继承?
-
对不起,是的。修复代码
-
第一个例子确实有效 --> studentGeneric.setItem(0, st1);其他的将不起作用,因为它们不是 Person 类型。您不会在方法参数中传递 setter 方法。 setter 方法不返回值(通常),即使它确实返回了值,它们也必须是 Person 类型,setItem 方法才能编译。
-
是的,它确实可以编译,但是它在程序运行时返回的值,我原以为它是字符串“Thor”,而是显示
namespace.Person -
您需要覆盖 Student 类中的 toString() 方法,或者如果您有学生类的 getFirstName() 方法,请在 MyGenericCollection 中更改此方法 --> Console.Out.WriteLine (列表[i]);到这个 Console.Out.WriteLine(list[i].getFirstName());