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

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • PUSHER

    PUSHER

    11 HAZİRAN 2014
  • superflyy88

    superflyy88

    8 ŞUBAT 2009