2012-06-25 123 views
0

我已经实现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,我正在“走“ 方法。这件事我可以用抽象类来做。那么使用泛型对抽象类的附加优势是什么?

+0

在你的例子中generic不可用。 –

+8

7个问题,但没有被接受的答案 - 如果你可以请标记一个问题,以回答你以前的帖子? – Kane

+0

做你的dogObj树皮?你的catObj喵? –

回答

5

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

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>。我认为,这将有助于你更好地理解它

0

你的代码更改为下一个

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

而你,也就能够使用DogCat。但是,眼镜为这种情况描述了更好的代码。

1

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

1

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

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