泛型和抽象类

时间:2012-06-25 06:22:56

标签: c#

我已将Generices实施如下:

  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”方法。我可以用抽象类做这件事。那么使用Generics而不是Abstract类有什么额外的好处呢?

5 个答案:

答案 0 :(得分:5)

在你的情况下,没有。在您希望代码可以使用不同类型重用的场景中,泛型是有意义的。在GenericAnimal<T>中,您没有对T执行任何操作。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

这是仿制药有用的地方。您可以使用List&lt; Animal&gt;来定义列表。然后只能将符合“is Animal”的对象添加到列表中。假设鱼不是动物,那么如果你试图添加一个,你将得到编译错误。此外,当您获得列表中的项目时,您会获得Animal实例而不仅仅是对象,因此您可以告诉他们立即行走。

答案 3 :(得分: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>。我认为它会帮助你更好地理解它

答案 4 :(得分:0)

将您的代码更改为下一个

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

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