我已将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类有什么额外的好处呢?
答案 0 :(得分:5)
在你的情况下,没有。在您希望代码可以使用不同类型重用的场景中,泛型是有意义的。在GenericAnimal<T>
中,您没有对T
执行任何操作。
答案 1 :(得分:1)
Generics
和Inheritance
是两个完全不同的概念,具有完全不同的功能。没有这样的比较“使用泛型而不是抽象类的附加优势是什么?”。如果您可以从这个意义上抽象出所有子对象的一些常用功能,那么使用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....");
}
}
您将能够使用Dog
和Cat
。但是eyossi为这种情况描述了更好的代码。