2011-03-11 244 views
0

在下面的示例控制台应用程序的工作,你会发现,该程序试图创建一个篮球队,然后,添加球员和教练的球队。如何使用泛型类型的泛型列表泛型类

应用程序的设计实现通用类(团队和个人)的具体类(湖人(),播放器()和教练())将继承。

程序抛出建立在点例外,我试图将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> 
    { 
    } 

回答

1

因为您声明团队类型为湖人和人类作为类型播放器。那些不平等。

你是否需要限制你的List?你不能只是宣布它为人?

abstract class Team<T> 
    { 
     public List<Person> Members = new List<Person>(); 
    } 
+0

是,我是新来的,我自己的自定义泛型类的工作,我从来没有意识到/认为在类签名(抽象类团队)的指定整个类定义中的类型。我现在明白了“公开列表>成员=新列表>();”考虑到示例程序设计,实际上并不合逻辑。 – Jed 2011-03-11 16:52:23

1

为什么不干脆:

//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 
    { 
    } 

仿制药的使用似乎完全不必要。简单的层次结构应该足够你。

1

你似乎在混淆遗传和泛型。尽管在技术上有所不同,但您可以将泛型类看作模板,而不是将它看作是一种关系。正常继承是你想要的。