SORU
27 Ocak 2011, PERŞEMBE


Neden (gerçekten mi?) Liste<T> tüm bu arabirimler uygulamak değil, sadece IList<T>?

List MSDN: bildirim

public class List<T> : IList<T>, ICollection<T>, 
 IEnumerable<T>, IList, ICollection, IEnumerable

Reflektör benzer görüntü sağlar. List gerçekten bu iş hiç de öyle olmadığını () uyguluyor? Kontrol ettim:

    interface I1 {}
    interface I2 : I1 {}
    interface I3 : I2 {}

    class A : I3 {}
    class B : I3, I2, I1 {}

    static void Main(string[] args)
    {
        var a = new A();
        var a1 = (I1)a;
        var a2 = (I2)a;
        var a3 = (I3)a;

        var b = new B();
        var b1 = (I1) b;
        var b2 = (I2)b;
        var b3 = (I3)b;
    }

derler.

[GÜNCELLEME]:

Anladığım kadarıyla arkadaşlar, tüm cevaplar o kalın:

class Program
{

    interface I1 {}
    interface I2 : I1 {}
    interface I3 : I2 {}

    class A : I3 {}
    class B : I3, I2, I1 {}

    static void I1M(I1 i1) {}
    static void I2M(I2 i2) {}
    static void I3M(I3 i3) {}

    static void Main(string[] args)
    {
        var a = new A();
        I1M(a);
        I2M(a);
        I3M(a);

        var b = new B();
        I1M(b);
        I2M(b);
        I3M(b);

        Console.ReadLine();
    }
}

hata verecekti, ama herhangi bir hata olmadan çalışır derler. Neden?

CEVAP
27 Ocak 2011, PERŞEMBE


GÜNCELLEME: Bu soru my blog entry for Monday April 4th 2011 temelini teşkil ediyordu. Harika soru için teşekkür ederim.

Ben birçok küçük sorular içine bir göz atalım.

List<T> gerçekten tüm bu arayüzler uygulamak?

Evet.

Neden?

Bir arabirim (, IList<T> demek) bir arabirimden kalıtımla (IEnumerable<T> demek) daha sonra türetilmiş bir arabirim uygulayıcıları da daha az türetilmiş bir arabirim uygulamak için gerekli olduğundan. Bu arayüz miras anlama geliyor; eğer daha türetilmiş bir tür sözleşme yerine getirmek sonra da daha az türetilmiş bir tür sözleşme yerine getirmek için gereklidir.

Bir sınıf bir temel arayüzlerini geçişli kapatılması tüm arayüzleri tüm yöntemleri uygulamak için gerekli?

Tam olarak.

Daha türetilmiş bir arabirimi uygulayan bir sınıf da daha az türetilmiş bu arabirimler tüm uyguladığını temel tür listesi devlet için gereklidir?

Hayır.

Sınıf DEĞİL devlet için gereklidir?

Hayır.

Bu yüzdenisteğe bağlıdaha az türetilmiş uygulanan arabirimleri taban türü listesinde belirtilmiştir olsun?

Evet.

Her zaman?

Her zaman oldu

interface I1 {}
interface I2 : I1 {}
interface I3 : I2 {} 

İ3 J1 dan devralan devletler olup isteğe bağlıdır.

class B : I3 {}

İ3 uygulayıcıları İ2 uygulamak ve J1, ama bunu yaparken olduklarını açıkça devlet için gerekli değildir için gereklidir. İsteğe bağlı.

class D : B {}

Türetilmiş sınıflar temel sınıf, bir arayüzü uygulayan re-devlet için gerekli değildir, ama bunu yapmak için izin verilir. (Bu durum; daha fazla ayrıntı için aşağıya bakın.)

class C<T> where T : I3
{
    public virtual void M<U>() where U : I3 {}
}

Tür bağımsız değişkenleri T karşılık gelen ve U ve T kısıtlamalar veya U ifade etmek için isteğe bağlıdır J1, İ2 uygulamak zorundadır.

Her zaman isteğe bağlı kısmi bir sınıfta yeniden devlet herhangi bir temel arayüz:

partial class E : I3 {}
partial class E {}

E ikinci yarısı İ3 veya İ2 bunu uygulayan veya J1, ama bunu yapmak için gerekli değil, devlet için izin verilir.

TAMAM, anladım; bu isteğe bağlıdır. Neden kimse gereksiz yere temel bir arayüz devlet?

Böylece, kodu anlamak daha kolay ve kendi kendine tanım yapar inandıkları için belki de.

Ya da, belki de geliştirici olarak kod yazdım

interface I1 {}
interface I2 {}
interface I3 : I1, I2 {}

ve, oh, bir dakika, I2 J1 dan miras beklemek gerektiğini fark etti. Neden bu düzenleme yaptıktan sonra geliştirici gidip İ3 Bildirgesi değiştirmek için gerektirirdeğilJ1 açık söz içerir? Geliştiriciler gereksiz bilgileri kaldırmak için zorlamak için bir sebep göremiyorum.

Okumak ve anlamak daha kolay olması dışında, herhangi birtekniktaban türü listesinde bir arayüz açıkça belirten ve olağanüstü ama ima bırakarak arasındaki fark?

Genelde hayır, ama bir durumda ince bir fark olabilir. B sınıfı bazı arabirimler uygulanmakta olan türetilmiş bir sınıf var mı varsayalım. D otomatik olarak B) bu arayüzler uygular Eğer yeniden devlet D sınıf listesi arabirimleri sonra C# derleyici yapararabirimi yeniden uygulama. Detayları biraz ince; eğer bunun nasıl çalıştığını ilgilenen varsa o zaman bölüm 13.4.6 okuma C# 4 dikkatli bir belirtimi tavsiye ederim.

List<T> kaynak aslında tüm bu arayüzler devlet kodu mu?

Hayır. Gerçek kaynak kodunu söylüyor

public class List<T> : IList<T>, System.Collections.IList

Neden MSDN tam arayüz listesi ama kod değil gerçek kaynak var mı?

Çünkü MSDN belgelerine; istediğiniz kadar çok bilgi vermek gerekiyor. Belgeleri on farklı sayfaları ile tam arayüz kümesi ne olduğunu öğrenmek için arama yapmak için daha tek bir yerde tamamlanması için çok daha açıktır.

Neden Reflektör tüm listeyi gösteriyor?

Reflektör sadece çalışmak için meta vardır. Tam listesine koyarak isteğe bağlı olduğundan, Reflektör orijinal kaynak kodu tam listesini içeren olsun ya da olmasın hiçbir fikri yok. Daha fazla bilgi tarafında err daha iyidir. Yine, Reflektör daha fazla bilgi göstermek yerine, ihtiyacınız olabilecek bilgileri gizleyerek sana yardım etmeye çalışıyor.

Neden IEnumerable<T> IEnumerable IList<T> mu devralmıyor IList miras değil mi? BONUS SORU:

Tam sayılar sırası sırası geldiği gibi her tamsayı boks ile nesneleri bir dizi olarak kabul edilebilir. Ama bir okuma-yazma tamsayılar listesi bir nesne okuma-yazma listesi içine bir dize koyun, çünkü okuma-yazma nesnelerin listesi olarak kabul edilemez. IList<T> ondan miras almaz yani IList, tüm sözleşme yerine getirmek için gerekli değildir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • Ayite Atiwoto (superjiffrey)

    Ayite Atiwot

    29 EYLÜL 2010
  • happyjpy

    happyjpy

    22 AĞUSTOS 2009