2009-12-08 8 views
25

Ben Açık yayınlama olmadan dahili arayüz uygulama yöntemleri nasıl dahili olarak adlandırılır?

public class AImplementation:IAInterface 
{ 
    void IAInterface.AInterfaceMethod() 
    { 
    } 

    void AnotherMethod() 
    { 
     ((IAInterface)this).AInterfaceMethod(); 
    } 
} 

nasıl açık döküm olmadan AnotherMethod() den AInterfaceMethod() aramak varsa?

+0

Oyuncularda sorun nedir? – adrianm

+0

Bu dil özelliğini keşfettiğimde kaşlarını çattım. Yine de ICONeable gibi bazı arayüzleri uygularken çok kullanışlıdır. –

+2

Neden o zaman başka şekilde yapmıyorsunuz? Kodu, açık arabirim yönteminden "normal" bir yönteme taşıyın. Sonra sadece tüm yöntemler (açık arabirim yöntemi dahil) bu yöntemi çağırsın. – adrianm

cevap

-3

"IAInterface" öğesini kaldırmanız yeterli değil mi? yöntem imzasından?

public class AImplementation : IAInterface 
{ 
    public void AInterfaceMethod() 
    { 
    } 

    void AnotherMethod() 
    { 
     this.AInterfaceMethod(); 
    } 
} 
+1

Sonra açık bir uygulama olmayacak. –

8

bu çalıştı ve çalışıyor ...

public class AImplementation : IAInterface 
{ 
    IAInterface IAInterface; 

    public AImplementation() { 
     IAInterface = (IAInterface)this; 
    } 

    void IAInterface.AInterfaceMethod() 
    { 
    } 

    void AnotherMethod() 
    { 
     IAInterface.AInterfaceMethod(); 
    } 
} 
0

Yapamazsın, ama onu çok yapmak varsa bir kolaylık yardımcı tanımlayabiliriz:

private IAInterface that { get { return (IAInterface)this; } }

Açıkça uygulanmış bir arabirim yöntemini çağırmak istediğinizde, ((IAInterface)this).method() yerine that.method()'u kullanabilirsiniz.

+1

Burada açık bir döküm işlemine gerek duymamanıza dikkat etmelisiniz (çünkü bu “implementasyondan 'IAInterface' olan implantasyona dönüşmektedir). –

5

Bir yardımcı özel mülkiyet tanıtabilirsiniz:

private IAInterface IAInterface { get { return this; } } 

void IAInterface.AInterfaceMethod() 
{ 
} 

void AnotherMethod() 
{ 
    IAInterface.AInterfaceMethod(); 
} 
49

cevapları bir dizi yapamazsın demek. Yanlışlar. Bunu, cast operatörünü kullanmadan yapmanın birçok yolu vardır.

Teknik # 1: "İşleç" yerine "as" operatörünü kullanın.

void AnotherMethod() 
{  
    (this as IAInterface).AInterfaceMethod(); // no cast here 
} 

Teknik # 2: yerel bir değişken aracılığıyla örtülü bir dönüşüm kullanın.

void AnotherMethod() 
{  
    IAInterface ia = this; 
    ia.AInterfaceMethod(); // no cast here either 
} 

Teknik # 3:

static class Extensions 
{ 
    public static void DoIt(this IAInterface ia) 
    { 
     ia.AInterfaceMethod(); // no cast here! 
    } 
} 
... 
void AnotherMethod() 
{  
    this.DoIt(); // no cast here either! 
} 

Teknik # 4: bir yardımcı tanıtmak:

private IAInterface AsIA() { return this; } 
void AnotherMethod() 
{  
    this.AsIA().IAInterfaceMethod(); // no casts here! 
} 
+5

Pedantic olmak için "cast operatörü" ni kullanmamayı istemedi, "açık bir şekilde casting olmadan" istediğini söyledi ve genel olarak "operatör" olarak nitelendirilen "açık döküm" olarak düşünüleceğini düşünüyorum. eğer dil spesifikasyon tanımları açısından doğruysa veya bu bağlamda sorunun bile anlamsız olup olmadığı). –

+1

Peki, cast operatörünün semantiği ve as operatörünün semantiği oldukça farklıdır, bu nedenle bunları birleştirmek mantıklı bir hatadır. Ayrıntılar için http://beta.blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx adresine bakın. –

+6

Bunun çok eski olduğunu biliyorum, ama bugün bu soru üzerine tökezledim. 'En iyi' yolu düşünmek doğru muyumlu olanı mı? Bu kod için en iyi derleme zaman koruması sunuyor muyum? Ya ben casting ya da "as" operasyonu ile devam ettiysem (aslında bu bağlamda bir anlam ifade etmiyorsa, ilk önce arayüzün uygulanması gereken nesne olduğu için), bana geçersiz bir arayüze girme riskiyle karşılaşıyorum. Bir çalışma zamanı hatası. Sınıfın uygulayamadığı bir arabirime yayınlamayı denerseniz, bunun yerine bir derleme zamanı hatası alıyorum ve çok daha iyi. – julealgon

0

Yine başka bir yol (iyi):

(this ?? default(IAInterface)).AInterfaceMethod(); 
bir uzantısı yöntem yazmak
1

Yine başka bir yoldur (Arayüz uygulanmamışsa Eric'in Tekniği # 2 ve ayrıca bir derleme zamanı hatası vermelisiniz)

 IAInterface AsIAInterface 
    { 
     get { return this; } 
    }