2011-07-20 17 views
5

aşağıdaki çalışır:VB.NET'te bir uygulama özelliğinin neden 'ReadOnly' belirticileriyle eşleşmesi gerekir? C#

interface I 
{ 
    int X { get; } 
} 

class C : I 
{ 
    public int X 
    { 
     get { ... } 
     set { ... } 
    } 
} 

VB.NET çalışmaz aşağıdadır:

Interface I 
    ReadOnly Property X As Integer 
End Interface 

Class C 
    Implements I 

    Public Property X As Integer Implements I.X 
     Get 
      ... 
     End Get 
     Set(value As Integer) 
      ... 
     End Set 
    End Property 
End Class 

hata mesajı Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers yeterince açıklayıcı, bu yüzden burada yanlış olduğunu bilirim. Aynı zamanda büyük bir sorun değil, çünkü bu sınırlama etrafında çalışmak oldukça kolay.

Yine de merak ediyorum: VB tasarımcılarının neden bu davayı C# 'dan farklı olarak tedavi etmeye karar verdiklerini bilen var mı?

+0

Arayüzünüzün C sürümünde mülkünüzde salt okunur göremiyorum? – Nikki9696

+0

@ Nikki9696: C# sürümündeki bir ayarlayıcının olmaması temelde eşdeğerdir. –

+0

@ Nikki9696 Bu ima edildi. Fark, olması gerekmiyor. Ama, Heinzi, açıkça VB.NET arabirim sürümünde belirtin, bu yüzden bu oldukça büyük bir fark. –

cevap

3

Ben VB tarafında hakkında emin değilim, ama C# IX açık olarak arabirim uygulaması ile de eklenen ayarlayıcı hakkında şikayette almak istiyorum:

interface I 
{ 
    int X { get; } 
} 

class C : I 
{ 
    int I.X // explicit implementation of I.X 
    { 
     get { return 1; } 
     set { } 
    } 
} 

Sen C# benzer bir hata alıyorum . VB, bu SO iplik kontrol etmek isteyebilirsiniz: Sen Interface I Mülkiyet üzerinde ReadOnly var ama If an interface defines a ReadOnly Property, how can an implementer provide the Setter to this property?

+0

+ 1, çok iyi bir nokta! – Heinzi

+0

Ne yazık ki, ben bir VB adamı değilim, bu yüzden ilk C# örneğinizle aynı şeyi nasıl yapacağınızı görmek için VB ile oynuyorum ... –

+1

Başka birinin bu sorunu yaşadığını düşünüyor, bkz: http://stackoverflow.com/questions/6307335/if-an-interface-defines-a-readonly-property-how-can-an-implementer-provide-the-s –

0

değil de kalıtsal Class C yüzden Mülkiyet imzalar, dolayısıyla hata uymuyor. Eminim, ReadOnly Mülkiyetine bir set erişimci ekleyemezsiniz.

+0

Sorun şu ki, bir readonly özelliği kullanamıyorsunuz sadece bir alıcı istediği bir arayüz uygulamak. – CodesInChaos

1

I.X'i uygulamak için salt okunur özellik sağlamanız gerekir; Eğer YourClass.X bir okuma-yazma özelliği, olmak istiyorsanız o zaman salt okunur o IX başka bir isim verilmelidir uygulayan (örn

 
    Public Property Xreadonly As Integer Implements I.X 

Ben .Net üç kullanımını gerektirir Tam olarak emin değilim salt okunur bir özelliği ve salt okunur özelliği bildiren bir nesnenin okuma-yazma özelliğine sahip olduğunu belirtmek yerine, özellik türleri (salt okunur, salt okunur ve salt okunur) yerine, ama belki de onun bir aldatmacının geçersiz kılınmasının, bir düzenleyicinin geçersiz kılınmasıyla aynı miras yolunu izleyeceğinden emin olmak istedikleri için, ancak, alıcılar ve ayarlayıcıların ayrı öğeler olarak daha yararlı olacağı durumlar olduğu görülecektir. Bazı durumlarda, örneğin, bir özelliği olması yararlı olabilir. Yöntem tipi ayarlayın; veya Set'in birden fazla aşırı yüklenmesinin olması yararlı olabilir; ne de olsa izin verilir.

İlgili konular