2014-01-30 2 views
6

я заметил, после некоторого времени использования дженериков, что не было большой разницы между этим:разница между базовым классом и contitioned родовой

public void DoSomething<T>(T t) where T : BaseClass{ 

} 

и это:

public void DoSomething(BaseClass t){ 

} 

Единственная разница у меня есть что первым методом могут быть добавлены другие ограничения, такие как интерфейсы или new(), но если вы используете его только так, как я его написал, я не вижу большой разницы. Может ли кто-нибудь указать какие-либо важные факторы на выбор того или иного?

ответ

6

Я думаю, что наиболее заметная разница - тип параметра внутри метода будет другим - в общем случае фактический тип, не общий - всегда BaseClass.

Эта информация полезна, когда вам нужно вызвать другие общие классы/методы.

class Cat : Animal {} 

void DoSomething<T>(T animal) where T:Animal 
{ 
    IEnumerable<T> repeatGeneric = Enumerable.Repeat(animal, 3); 
    var repeatGenericVar = Enumerable.Repeat(animal, 3); 
} 
void DoSomething(Animal animal) 
{ 
    IEnumerable<Animal> repeat = Enumerable.Repeat(animal, 3); 
    var repeatVar = Enumerable.Repeat(animal, 3); 
} 

Теперь, если вы звоните оба с new Cat():

  • типа как repeatGeneric и repeatGenericVar будет IEnumerable<Cat> (обратите внимание, что var статически находят тип, показанный выделить тип факта известно статический)
  • Тип и repeat и repeatVar будет IEnumrable<Animal>, несмотря на то, что Cat был принят.
+0

Для вашего ответа я думаю, что, как правило, лучше использовать общую версию, поэтому вы можете хранить больше информации о типе. – Gerard

+0

@Gerard - Я бы не сказал, что лучше - они служат различным целям и имеют разные недостатки. То есть generics и inheritance часто вызывают путаницу: с помощью 'class My {}' следующие типы 'My ' и 'My ' чувствуют себя в некотором роде, но они всего лишь 2 отдельных типа; правильное тестирование общих методов требует больше случаев из-за открытости: 'void Do (int)' нуждается в тестировании для некоторых значений 'int', но' Void Do (T) 'нужен тест для некоторых типов значений, ссылочных типов; смешанный общий и не общий код иногда сложно, особенно когда общий тип требует реального типа ... –

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