2011-02-18 9 views
8

Jaki jest cel nowego() podczas deklaracji klasy BaseEntityCollection?
Jeśli idę, aby go usunąć, mam błąd z następującym komunikatem „T musi być non-abstrakcyjny typ z konstruktora bez parametrów publicznego w celu wykorzystania go jako parametr ...”Jaki jest cel nowego() podczas deklarowania klasy ogólnej?

public abstract partial class BaseEntityCollection<T> : 
     List<T> where T : BaseEntity, new() 

Odpowiedz

18

Oznacza to, że niezależnie od klasy określonej dla T, ma on domyślny konstruktor (bez parametrów).

Dlatego w klasie rodzajowy, można zrobić new T() i będzie utworzyć nowy obiekt typu T.

1

Typ T musi mieć konstruktora bez parametrów. Umożliwia to tworzenie nowych instancji wykonując var t = new T(), co byłoby niemożliwe w przeciwnym razie.

4

Zapisywanie new() wymusza na parametrze domyślny konstruktor.

Bez tego nie można pisać new T().
Twój błąd występuje, gdy próbujesz przekazać inny niż new() typ jako parametr d.


Również, do not inherit List<T>.
Zamiast tego powinieneś dziedziczyć Collection<T>, który jest przeznaczony do dziedziczenia.

+0

Jeśli mam używać Collectiion , w jaki sposób mogę utworzyć nowy obiekt kolekcji, który dziedziczy z kolekcji ? – Ahmed

+1

@Ahmed: Po prostu ją dziedzicz. – SLaks

1

Jest to oznaczenie ogólne ograniczenie: Musi mieć (publiczny) konstruktor bez parametrów.

0

Jest to jedno z możliwych "ograniczeń rodzajowych", które można skojarzyć z typem generycznym. Korzystanie z ograniczenia "new()" pozwoli ci tylko na użycie typu ogólnego, jeśli ma konstruktor bez parametrów. Może to być użyteczne dla rzeczy jak serializacji lub fabryka typu metod, gdzie trzeba stworzyć obiekt typu T.

Oto niektóre inne ograniczenia typu rodzajowego: http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.80).aspx

1

Oznacza to, że typ rodzajowy ma mieć konstruktora bez parametrów.

BaseEntityCollection<T> : List<T> 

Nie jestem pewien, co tutaj robisz, ale myślę, że jest to sprzeczne z zasadą Liskova. Sprawdź swoją hierarchię.

Constraints on Type Parameters

+0

Co to jest zasada Liskova? – Ahmed