2011-07-11 16 views
6

Özel bir sözlüğüm var. Tam olarak bunu nasıl emin değilim ama olsun yöntemi sanal yapma arıyorum ama set yöntemi:C# Dizin oluşturucu özellikleri - Set yöntemini değil, sanallaştırmanın herhangi bir yolu var mı?

public TValue this[TKey key] 
    { 
     get { ... } 
     set { ... } 
    } 

yüzden doğru kombinasyon buysa bu mümkün ve var mı?

protected virtual TValue GetValue(TKey key) { ...} 

public TValue this[TKey key] 
{ 
    get { return GetValue(key); } 
    set { ... } 
} 
+0

sen ne elde etmek istiyoruz sadece sanal 'getiri' yapmak? Bunu yapmanın daha iyi bir yolu olabilir. –

+0

Sadece "ReadOnlyDictionary" öğemi genişletmeyi denemeye çalışıyorum. Salt okunur bir sözlük olduğu için, set yöntemini desteklemiyorum (bir istisna atar), ancak bir extending sınıfı get metodundan ek iş yapmak isteyebilir, bu yüzden bunları geçersiz kılabilir ve modifiye edebilirler. –

+0

"Sanallaştır" yöntemini sanal yapmaya çalışmamalısınız, bunun yerine bazı sanal "OnGetCalled" yöntemine sahip olmalısınız ve türetilmiş sınıfın geçersiz kılınmasına izin verin. Türetilmiş sınıf, Base sürümünü çağırmadan "get" (yani Mark'ın önerisi) geçersiz kılmayacaktır, bu nedenle ayrı bir yöntem sözleşmeyi açık hale getirecektir. –

cevap

12

Sen doğrudan bunu yapamaz .

public TValue this[TKey key] 
{ 
    get { return GetValue(key) } 
    set { ... } 
} 

protected virtual TValue GetValue(TKey key) 
{ 
    ... 
} 
+1

+1 beni 10 saniye yenmek için –

+0

Nevermind, benim hatam. Afedersiniz. Aklımda olan çözüm açıkça setter özel yaptı. Yine de, koleksiyon salt okunursa, problemi görmüyorum ama onun farklı bir çözümü. – InBetween

6

Maalesef ... C# Bu işlem için herhangi bir sözdizimi vardır, ancak bunun yerine bunu yapabilirsiniz: Eğer ayrı yöntemi eklemek gerekir -

0

Onların özelliği ayarlanmış değil nasıl özellik okunur nasıl tanımlamak zorunda ama bir durum yaratacak burada yapmaya çalıştığımız şey olduğunu varsayıyorum?

Bu bana kötü bir fikir gibi geliyor. _myVar değerini ayarlayan bir ayarınız olabilir, ancak son geliştirici _someOtherVar yazan bir alıcı oluşturuyor. Yani, kullanım durumunun ne olduğunu bilmiyorum, bu yüzden bir şeyleri kaçırmam çok muhtemel. Ne olursa olsun

, ben bu önceki soru yardımcı olabileceğini düşündüğümüz: Why is it impossible to override a getter-only property and add a setter?

1
şey yanlış anlama olabilir ama senin Dictionary bunu gerçekten readony olduğundan emin olmak için bir sarıcı uygulamak zorunda salt okunur olacak eğer

(Sözlüğün endeksli bir özellik değildir sanal böylece aşağıdakileri yapabilirsiniz bu durumda davranışını) geçersiz kılamaz:

public class ReadOnlyDictionary<TKey, TValue> 
{ 
    Dictionary<TKey, TValue> innerDictionary; 

    public virtual TValue this[TKey key] 
    { 
     get 
     { 
      return innerDictionary[key]; 
     } 
     private set 
     { 
      innerDictionary[key] = value; 
     } 
    } 
} 
İlgili konular