"Herhangi bir genel tür" tanımıyla C # genel "nerede kısıtlama"?


113

Örnek vereyim:

  1. Bazı genel sınıf / arayüz tanımım var:

    interface IGenericCar< T > {...}

  2. Yukarıdaki sınıfla ilişkilendirmek istediğim başka bir sınıfım / arayüzüm var, örneğin:

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

Temel olarak, jenerik IGarrage'ımın IGenericCar, olup olmadığına bakılmaksızın IGenericCar<int>veya IGenericCar<System.Color>bu türe herhangi bir bağımlılığım olmadığı için bağımlı olmasını istiyorum.

Yanıtlar:


142

Bunu başarmanın tipik olarak 2 yolu vardır.

Seçenek1 : Kısıtlamaya hangisinin aktarılması gerektiğini IGarragetemsil eden başka bir parametre ekleyin :TIGenericCar<T>

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

Seçenek2 : IGenericCar<T>Genel olmayan ve bu arayüzle kısıtlanan bir temel arayüz tanımlayın

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

6
Tamam, ancak genel türümü Tiçinde kullanmam gerekirse ne yapmalıyım IGarage<TCar>? Seçenek2'de herhangi bir olasılık göremiyorum. En iyi çözüm, IGarage<TCar>türü Tanaliz ederek tür bulunursa olacaktır TCar.
pt12lol

2
Gelecek nesil için, ham genel türden bir tür parametresine sahip olan ancak yalnızca çalışma zamanında yansıma ile bir tür CAN oluşturulabilir ve oluşturulan sınıf hiçbir zaman oluşturulamaz, çünkü ham genel tür parametresi tam bir tanım olmadan asla otomatik olarak oluşturulamaz. ITS ilgili tip parametresi. En dıştaki sınıfın süper jenerik statik üyelerinin (yani IGarage<IGenericCar<?>>.TellMeAboutCarsInGeneral(), muhtemelen zayıf tasarımın bir sonucu olabilir) olduğu durumlar dışında, bunun nerede yararlı olabileceğini bilmiyorum , ancak bunu düzeltmemde yaptım ve bunu mümkün.
Michael Hoffmann

Herkesin IGenericCar arayüzünü bir sınıfa ekleyebileceğini ve kısıtlı yöntemi beklenmedik bir sınıfla bozabileceğini varsayıyorum.
N-yedi

2
@ pt12lol: Eğer IGarrage<TCar>temeldeki jenerik türü işliyorsa (örneğin, söz konusu türün bir özelliğini işliyorsa ), o zaman türü belirtmeniz gereken türü bilmesi gerekir, bu da seçenek 1'dir (o zaman geçerli olan tek seçenek). Bununla birlikte, IGarrage<TCar>temeldeki genel türü doğrudan işlemezse (tüm IGarrage<TCar>kod bu temel türden bağımsızdır), bu durumda seçenek 2 geçerlidir.
Flater

6

Şunun gibi bir şey yapmak mantıklı olur mu:

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.