2013-10-04 5 views
7

Я пытаюсь создать производный класс от общего класса, и мне было интересно, что различия междуВ чем разница между «классом A: B <C>» и «классом A <T>: B <T> где T: C"?

public class A<T> : B<T> where T : C 
{ 
} 

и

public class A: B<C> 
{ 
} 

Внутри класса А там, вероятно, не будет никакого кода, т.к. (на данный момент) он не будет отличаться от класса B. Я хочу только выделить два класса.

Заранее спасибо.

ответ

8

Допустим, у вас есть класс

public class D : C 
{ 
} 

Тогда в вашем первом пример, приведенный ниже.

var a = new A<D> 

Вы можете использовать любой класс для T, что в конечном счете происходит из С.

В то время как ваш второй код закодирован, чтобы иметь B использовать C для параметра genric типа и не является универсальным.

2

Это Constraints with generics in C#, для образца:

В

public class A<T> : B<T> where T : C 
{ 
} 

Родовое T должен быть C типа или ребенок от него (то, что это абстракция).

В

public class A: B<C> 
{ 
} 

Родовое является C.

0

Во второй опции вы будете в конечном итоге с необщего класса A, в то время как в первом варианте вы будете иметь общий класс A

2

В вашем первом примере A является общим классом, типа C. Он также наследует от класса B типа C.

Ваш второй пример имеет следующие свойства:

A является не общий класс. Он наследует от класса B типа C.

Итак, они на самом деле совсем другие.

1

В первом примере вы делаете в A Classкак общий класс, что это T должно быть дано при создании экземпляра класса.

A<C> instance = new A<C>(); 

Во втором примере, A Classне является общим классом, так как при инстанцировании A Class нет необходимости объявлять T с момента его происходит автоматически за кулисами на основе A Class декларации.

A instance = new A(); 

Еще одно отличие

Если у вас есть данное иерархическое дерево наследования:

enter image description here

На первом примере, когда экземпляр A класса, каждый из унаследованного класс может использоваться как T.

На втором примере, вы можете Инстанцировать в A класс и указать C2 класс, так что только классы, наследуемые от C2 можно использовать insde в A класса.

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