SORU
28 Ocak 2013, PAZARTESİ


Genel tür parametre kovaryans ve birden çok arabirim uygulamaları

Eğer değişkenle birlikte tür parametresi ile genel bir arayüzü var, bu gibi:

interface IGeneric<out T>
{
    string GetName();
}

Ve ben Eğer bu sınıf hiyerarşisini tanımlamak:

class Base {}
class Derived1 : Base{}
class Derived2 : Base{}

O zaman arayüzü iki kez bu şekilde tek bir sınıf üzerinde uygulamak, açık arabirim uygulaması kullanıyorum

class DoubleDown: IGeneric<Derived1>, IGeneric<Derived2>
{
   string IGeneric<Derived1>.GetName()
   {
     return "Derived1";
   }

   string IGeneric<Derived2>.GetName()
   {
     return "Derived2";
   }  
}

Eğer kullanırsam (genel olmayan)DoubleDown sınıf IGeneric<Derived1> IGeneric<Derived2> kadro beklendiği gibi işlevleri

var x = new DoubleDown();
IGeneric<Derived1> id1 = x;        //cast to IGeneric<Derived1>
Console.WriteLine(id1.GetName());  //Derived1
IGeneric<Derived2> id2 = x;        //cast to IGeneric<Derived2>
Console.WriteLine(id2.GetName());  //Derived2

Ancak, IGeneric<Base> x döküm aşağıdaki sonucu verir:

IGeneric<Base> b = x;
Console.WriteLine(b.GetName());   //Derived1

Çağrı iki uygulamaları arasında belirsiz olarak derleyici hata verecek bekliyordum, ama ilk arayüz olarak döndü.

Neden bu izin veriliyor?

(A class implementing two different IObservables?. esinlenerek Bu başarısız olacak bir meslektaşım, ama her nasılsa, değil mi) göstermeye çalıştım

CEVAP
5 ŞUBAT 2013, Salı


Eğer her iki test varsa:

class DoubleDown: IGeneric<Derived1>, IGeneric<Derived2> {
    string IGeneric<Derived1>.GetName() {
        return "Derived1";
    }

    string IGeneric<Derived2>.GetName() {
        return "Derived2";
    }
}

class DoubleDown: IGeneric<Derived2>, IGeneric<Derived1> {
    string IGeneric<Derived1>.GetName() {
        return "Derived1";
    }

    string IGeneric<Derived2>.GetName() {
        return "Derived2";
    }
}

Zaten gerçekte sonuç fark, olması gerekirsipariş değişiklikleri arabirimleri uygulamak için size bildirmek. Ama bir şeyler söylemek istiyorumsadece tanımlanmamış.

Öncelikle belirtimi(§13.4.4 eşleme Arayüzü) diyor ki:

  • Eğer birden fazla üye uyuyorsabelirtilmemişhangi üye I. M. uygulamasıdır
  • Bu durum olabilirsadeceeğer genel bir tür beyan olarak iki üye var burada oluşturulmuş bir tür Ler oluşurfarklı imzalarimzaları aynı marka ama.

Burada dikkate alınması gereken iki soru var:

  • S1: genel arayüzlerini Yapmak zorundafarklı imzalar?IGeneric<Derived2> IGeneric<Derived1>.

  • S2: deyim IGeneric<Base> b=x; kendi imzaları tür bağımsız değişkenleri ile aynı marka Olabilir mi?

Böylece, karar senin belirtilmemiş şartını yerine getirmesi. Ama bu nasıl olabilir?arabirimi başvuru için belirtilen her tür nesne DoubleDown her zaman DoubleDown. Yani, her zaman GetName bu iki yöntemi vardır. Arabirimi aslında başvuru için, gerçekleştirir belirtinsözleşme seçimi.

Aşağıda gerçek test, yakalanan görüntünün bir parçası

enter image description here

Bu resim zamanında GetMembers ile döndü ne olacağını gösterir. Tüm durumlarda, 24*, *IGeneric<Derived2> başvuru ya IGeneric<Base> hiçbir şey farklı. İki resim daha ayrıntılı aşağıdaki:

enter image description here enter image description here

Bu görüntüler, bu iki genel türetilmiş arayüzleri de aynı isim var ne de/belirteçleri onları aynı yapmak başka bir imza gösterilir.

Ve şimdi nedenini biliyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • picster

    picster

    20 NİSAN 2006
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005