2010-11-10 23 views
6

soru sola, onu alsa bile. C# içinde jenerik kullanmanın bir yolu var, böylece bu işe yarayabilir mi? Onları soyut sınıflar haline getirirsem, iyi görünüyor, ancak bunlara arayüz olarak ihtiyacım var.C# miras İki arayüzleri var

+1

Hangi .NET sürümünü kullanıyorsunuz? – Dinah

+0

@Dinah: Çerçeve versiyonu neden bu durumda bir fark yaratıyor? – LukeH

+0

@LukeH: Çünkü .NET 4.0, bunu ele alabilecek Kovaryans ve Kontra-varyansa sahiptir. dmurph 4.0 olmasına rağmen bu sorunu yaşıyorsa, sorun farklı olurdu daha konu öncesi 4.0 – Dinah

cevap

11

Aradığınız özellik jenerik Varyans (Kovaryans ve contravariance) olarak anılacaktır ne olduğunu. Bu, .net framework 4'ten başlayarak bunun için sınırlı bir destek var. İşte ilginç bir yazı: How is Generic Covariance & Contra-variance Implemented in C# 4.0?

Ve işte MSDN entry on Covariance and Contravariance in Generics.

+0

msdn bağlantı için teşekkürler, yardımcı oldu, ben başka bir şekilde benim sorunumu çözmek zorunda gibi görünüyor –

7

Bir kovaryans sorunu yok. Eğer yapabilirsek:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

Bu dict Tip A'nın bir nesne koymak için bir derleyici hatası olmadan mümkün olacaktır.

Sorun şu şekilde görünüyor: Dictionary<int, A> ancak gerçekten Dictionary<int, B>() yazıyor (bu nedenle A tipi bir nesne yerleştirme, geçersiz bir yayınlama nedeniyle bir çalışma zamanı hatası veriyordu), bu yüzden denemeye bile izin verilmemelidir. yapamayacağınız, bu yüzden de dict Tip A'nın bir nesne koyun:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

bir çalışma zamanı hata yapmaktan koruyor.
siz bu konuda Eric Lippert blog kontrol etmek istiyorum: http://blogs.msdn.com/b/ericlippert/

Söylemesi en sevdiği konulardan biri, bu yüzden oldukça kapsamlı bu.

+0

blog bağlantısı için teşekkürler!Bu mantıklıdır –

0

Ben bunun arkasındaki düşünce kusurlu görünüyor çünkü soruna bir yol bulmak için gidiyoruz sanmıyorum. Bunu açıklamak için, başka bir arayüze yapalım: Ben denemek zaman ne sonra meydana gelir

Dictionary<int, A> dict = new Dictionary<int, B>(); 

:

Şimdi
public interface C : A 
{ 
    void cMethod(); 
} 

, kodunuzu kullanmasına izin?

C c = new ClassThatImplementsC(); 
dict.Add(1, c); 

çok, çok daha fazla ayrıntı için Eric Lippert's Covariance and Contravarience FAQ bir göz atın.

+1

Bu aslında Alexandra'nın SSS'sidir; Sadece düzenledim. –

+0

bu da çok anlamlı, teşekkürler –