2012-06-25 6 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, я получаю «Прогулка "метод. Эта вещь, которую я могу сделать, используя абстрактный класс. Тогда каково дополнительное преимущество использования класса Generics over Abstract?

+0

в вашем примере generic не используется. –

+8

7 вопросов и не принимаются ответы - Если вы могли бы пометить вопрос как ответ на ваши предыдущие сообщения? – Kane

+0

делает ваш dogObj Bark? ваш catObj Mew? –

ответ

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...."); 
    } 
} 

И вы будете иметь возможность использовать Dog и Cat. Но eyossi описал лучший код для такой ситуации.

1

Generics и Inheritance - это две совершенно разные концепции и имеют совершенно разные функции. Нет такого сравнения: «Каково дополнительное преимущество использования Generics over Abstract class?». Если вы можете абстрагировать некоторые общие функции от всех ваших дочерних объектов, в этом смысле имеет смысл использовать Abstract class. Here больше информации на Generics.

1

Ваш конкретный пример лучше решается обычным наследованием без дженериков - как подкласса Dog, так и Cat Animal. Однако, скажите, теперь вам нужен список животных. В качестве универсального решения вы можете выбрать ArrayList, к которому вы можете добавить экземпляры кошки и собаки. Однако метод Add ArrayList принимает объект как параметр. Поэтому вы также можете добавить рыбу в список, и рыба не может ходить. Когда вы обрабатываете список, чтобы рассказать всем животным о том, как идти, сначала вам нужно проверить, что они животные.

Это то, где помогают дженерики. Вы можете определить свой список, используя List < Animal>, а затем в список могут быть добавлены только объекты, которые соответствуют «is Animal». В предположении, что рыба не является животным, тогда, если вы попытаетесь добавить ее, вы получите ошибку компилятора. Кроме того, когда вы получаете элементы в списке, вы получаете экземпляры Animal, а не просто объекты, поэтому вы можете сразу сказать им идти.

Смежные вопросы