SORU
30 Kasım 2009, PAZARTESİ


Dönüştürme Listesi<DerivedClass> Liste<BaseClass>

Temel sınıf/arabirimden devralır şansımız varken, neden biz List<>bildirebilirsiniz. aynı sınıf/arayüzü kullanarak mı?

interface A
{ }

class B : A
{ }

class C : B
{ }

class Test
{
    static void Main(string[] args)
    {
        A a = new C(); // OK
        List<A> listOfA = new List<C>(); // compiler Error
    }
}

Başka bir yol var mı?

CEVAP
30 Kasım 2009, PAZARTESİ


Her şeyden önce, imkansız-anlamak gibi isimler, B, C Kullanın Hayvan, Memeli, Zürafa sınıfı, ya da Gıda, Meyve, Portakal veya ilişkileri net olduğu bir şey kullanmayı bırakın.

Eğer soru "neden türde bir değişken için zürafa bir hayvan atayın bu hayvan türünden bir değişken listesine zürafalar bir listesini atayın miyim?" sonra.

Cevap: varsayalım olabilir. O zaman ne yanlış gidebilir ki?

Peki, hayvanlar listesine bir Kaplan ekleyebilirsiniz. Sen hayvanların bir listesini tutan bir değişken zürafalar bir listesini koymak için izin yeneriz. Sonra o listeye bir kaplan eklemek deneyin. Ne olur? Zürafalar listesini içeren bir kaplan ister misiniz? Bir kaza ister misin? ya da derleyici atama yasadışı yaparak kaza sizi korumak için ilk etapta ister misin?

İkincisi seçiyoruz.

Bu tür dönüştürme, bir "" dönüşüm. kovaryant denir C# 4'te arabirimleri ve delegeler üzerinde kovaryant dönüştürme yapmanıza izin vermeyeceğizdönüşüm her zaman güvende olsun. Kovaryans blog yazılarımı görmek ve ayrıntılar için contravariance. (Bu hafta her Pazartesi ve perşembe günü bu konuda yeni bir tane olacak.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • michaeljacksonVEVO

    michaeljacks

    2 EYLÜL 2009
  • Shantanu Sood

    Shantanu Soo

    3 Kasım 2008
  • UKF Dubstep

    UKF Dubstep

    29 NİSAN 2009