2012-06-27 22 views
19

class A numaralı telefonu arayabileceğimiz bir üst sınıfım var ve birkaç alt sınıf, ör. class a1 : A, class a2 : A, ... ve a6 : A. Benim class B,B içinde alt sınıflardan birini oluşturan ve ekler bir dizi yöntem var.C# create object object = new T()?

Şu anda sahip olduğum kodumu kısaltmak istiyorum. Bunun yerine

Adda1() 
{ 
    aList.Add(new a1()); 
} 

Adda2() 
{ 
    aList.Add(new a2()); 
} 

... 

Adda6() 
{ 
    aList.Add(new a6()); 
} 

Onun yerine bu

Add<T>() 
{ 
    aList.Add(new T()); // This gives an error saying there is no class T. 
} 

benzer bir şey yazmak istiyorum yazının olması mümkün mü?

T'un A türünde mi yoksa alt sınıflarından biri mi olması gerektiği de kısıtlanabilir mi?

+0

olası yinelenen [Jenerik türden örneği oluşturma?] (http://stackoverflow.com/questions/731452/create-instance- -generik tip) –

cevap

32

Lee'nin cevabı doğrudur. Ayrıca türüne ait nesne eklemek böylece bir sınırlama T : A ihtiyaç

void Add<T>() where T : new() 
{ 
    ... new T() ... 
} 

:

nedeni sırayla senin tipin parametresine bir new() kısıtlamayı eklemem gerekiyor new T() arama yapabilmek için olmasıdır T, bir List<A>.

Not: Diğer contraints birlikte new() kullandığınızda, new() kısıtlaması son gelmelidir. arasında

İlgili

+0

Teşekkür ederim. Bu, "A" sınıfını tip kısıtlaması olarak geçebileceğim anlamına gelir. Kısıtlama olarak sadece A'nın alt sınıflarını geçmek mümkün kılmanın bir yolu var mı? – sehlstrom

+0

@sehlstrom: Hayır, ancak bunu, eğer biri "A" türünde bir nesneyi geçerse bir istisna isteğinde bulunup atayacağınızı test edebilirsiniz. Ayrıca “A” özetini yapmayı düşünebilirsiniz. –

+0

Greate! Yani eğer 'A' soyut ise, onu geçemem? Ya da geçebilirim, ancak bir örnek oluşturmak mümkün olmayacak mı? – sehlstrom

26
public void Add<T>() where T : A, new() 
{ 
    aList.Add(new T()); 
} 
+0

Daha fazla bilgi için http: // msdn adresine bakın. .microsoft.com/en-us/kütüphane/twcad0zb. – SirPentor

+0

Teşekkürler, günü kurtardı! – idok

İlgili konular