如何使用泛型类型的泛型列表泛型类
问题描述:
在下面的示例控制台应用程序的工作,你会发现,该程序试图创建一个篮球队,然后,添加球员和教练的球队。如何使用泛型类型的泛型列表泛型类
应用程序的设计实现通用类(团队和个人)的具体类(湖人(),播放器()和教练())将继承。
程序抛出建立在点例外,我试图将Person对象添加到列表team.Members。
异常读取:
最好重载方法匹配 'System.Collections.Generic.List>。新增(人)' 具有一些无效 参数。
我不明白为什么编译器不允许我到通用播放器(科比和菲尔)添加到成员列表成员时,被定义为通用播放器的泛型列表。
你能解释一下错误的原因,以及如何解决它?
此外,您还可以填补我在下面的示例程序是否是不典型的,我们应该如何实现仿制药?换句话说,鉴于下面程序中的错误,这让我想知道为什么我应该实现泛型,而不是坚持使用正常的抽象类。
顺便说一句,请不要反对票,只是因为你不喜欢湖人队;)
class Program
{
static void Main(string[] args)
{
//Create a team
Team<Lakers> team = new Lakers();
//Create a player then add the player to the list of team members
Person<Player> p = new Player();
p.Name = "Kobe";
team.Members.Add(p); //Invalid argument exception here
//Create a coach then add the coach to the list of team members
Person<Coach> c = new Coach();
c.Name = "Phil";
team.Members.Add(c); //Invalid argument exception here
//Display the members of the team
team.Members.ForEach(n => Console.WriteLine(n.Name));
Console.ReadLine();
}
}
//A generic class containing a generic list of a generic type
abstract class Team<T>
{
public List<Person<T>> Members = new List<Person<T>>();
}
//A concrete basketball team
class Lakers : Team<Lakers>
{
}
//A generic class that represents a person
abstract class Person<T>
{
public string Name { get; set; }
}
//A concrete person that represents a basketball player
class Player : Person<Player>
{
}
//A concrete person that represents a basketball coach
class Coach : Person<Coach>
{
}
答
因为您声明团队类型为湖人和人类作为类型播放器。那些不平等。
你是否需要限制你的List?你不能只是宣布它为人?
abstract class Team<T>
{
public List<Person> Members = new List<Person>();
}
答
为什么不干脆:
//An abstract class that represents a person
abstract class Person
{
public string Name { get; set; }
}
//A concrete person that represents a basketball player
class Player : Person
{
}
//A concrete person that represents a basketball coach
class Coach : Person
{
}
仿制药的使用似乎完全不必要。简单的层次结构应该足够你。
答
你似乎在混淆遗传和泛型。尽管在技术上有所不同,但您可以将泛型类看作模板,而不是将它看作是一种关系。正常继承是你想要的。
是,我是新来的,我自己的自定义泛型类的工作,我从来没有意识到/认为在类签名(抽象类团队)的指定整个类定义中的类型。我现在明白了“公开列表>成员=新列表>();”考虑到示例程序设计,实际上并不合逻辑。 –
Jed
2011-03-11 16:52:23