0

我已经实现了以下泛型:

  public class GenericAnimal<T> 
  {
    public int legs;
    public void Walk()
    {
        Console.WriteLine("Animals Walk....");
    }
}

public class Dog 
{
    public void Bark()
    {
        Console.WriteLine("Barking....");
    }
}

public class Cat 
{
    public void Mew()
    {
        Console.WriteLine("Mewing....");
    }
}

然后我使用的类如下:

        GenericAnimal<Dog> dogObj = new GenericAnimal<Dog>();
        GenericAnimal<Cat> catObj = new GenericAnimal<Cat>(); 

在 dogObj 和 catObj 中,我都得到了“Walk”方法。我可以使用抽象类来做这件事。那么使用泛型而不是抽象类的额外优势是什么?

4

5 回答 5

5

在你的情况下,没有。泛型在您希望代码可被不同类型重用的场景中是有意义的。在GenericAnimal<T>,你没有做任何事情T

于 2012-06-25T06:26:37.960 回答
1

GenericsInheritance是两个完全不同的概念,具有完全不同的功能。没有这样的比较“使用泛型而不是抽象类的额外优势是什么?”。如果您可以从这个意义上从所有子对象中抽象出一些通用功能,那么使用Abstract class. 这里有更多关于Generics.

于 2012-06-25T06:41:22.840 回答
1

您的具体示例最好通过没有泛型的正常继承来解决 - Dog 和 Cat 子类 Animal。但是,假设您现在想要一份动物列表。作为非通用解决方案,您可以选择一个 ArrayList,您可以在其中添加 cat 和 dog 实例。但是,ArrayList 的 Add 方法将对象作为参数。因此,您也可以将一条鱼添加到列表中,而一条鱼不能行走。当您处理列表以告诉所有动物走路时,您首先必须检查它们是否是动物。

这就是泛型帮助的地方。您可以使用 List<Animal> 定义您的列表,然后只能将符合“is Animal”的对象添加到列表中。假设一条鱼不是动物,那么如果你尝试添加一条鱼,你会得到一个编译器错误。此外,当您获取列表中的项目时,您会得到 Animal 实例而不仅仅是对象,因此您可以告诉它们立即行走。

于 2012-06-25T06:47:02.790 回答
0

将您的代码更改为下一个

public class GenericAnimal<T> 
{
  public T Instance{get;set;}
  public int legs;
  public void Walk()
  {
      Console.WriteLine("Animals Walk....");
  }
}

您将能够使用DogCat。但是 eyossi 为这种情况描述了更好的代码。

于 2012-06-25T06:37:37.613 回答
0

尝试改写:

public class Animal
{
  public int legs;
  public void Walk()
  {
      Console.WriteLine("Animals Walk....");
  }
}

public class Dog : Animal
{
   public void Bark()
    {
      Console.WriteLine("Barking....");
    }
}

public class Cat : Animal
{
   public void Mew()
   {
      Console.WriteLine("Mewing....");
   }
}

并尝试制作两个列表:第一个仅列出猫,第二个仅列出狗-首先不使用List<T>,然后尝试使用List<T>。我认为它将帮助您更好地理解它

于 2012-06-25T06:32:33.820 回答