2011-07-11 5 views
6

Mam specjalny typ słownika. Nie jestem pewien jak to zrobić dokładnie, ale szukam, aby metoda get wirtualne, ale nie metoda set:C# Właściwości indeksatora - Jakikolwiek sposób wirtualizacji get a nie ustawionej metody?

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

Czy to możliwe, a jeśli tak, jaka jest prawidłowa kombinacja?

+0

Co chcesz osiągnąć przez tworząc tylko getter 'virtual'? Może być lepszy sposób na zrobienie tego. –

+0

Po prostu próbuję umożliwić rozszerzenie mojej "ReadOnlyDictionary". Ponieważ jest to słownik tylko do odczytu, nie obsługuję metody set (zgłasza wyjątek), ale rozszerzająca się klasa może chcieć wykonać dodatkową pracę z metody get, więc może ją przesłonić i zmodyfikować. –

+0

Niż nie powinieneś próbować uczynić metodę "get" wirtualną, ale zamiast tego masz wirtualną metodę "OnGetCalled" i pozwól klasie pochodnej ją zastąpić. Klasa pochodna nie będzie w stanie zastąpić "dostać" (tj. Według sugestii Marka) bez wywoływania wersji Base, więc oddzielna metoda spowoduje wyraźne zawarcie umowy. –

Odpowiedz

12

Nie można tego zrobić bezpośrednio - trzeba by dodać odrębną metodę:

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

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

+1 za pokonanie mnie 10 sekund –

+0

Nieważne, moja wina. Przepraszam. Rozwiązanie, o którym myślałem, w oczywisty sposób sprawiło, że seter był prywatny. Mimo to, jeśli kolekcja jest tylko do odczytu, nie widzę problemu, ale jest to inne rozwiązanie. – InBetween

6

Niestety ... nie ma składnia robi to w C#, ale można to zrobić zamiast .

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

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

Jestem zakładając, co starasz się zrobić tutaj jest stworzenie sytuacji, w których trzeba określić, w jaki sposób nieruchomość jest czytać, ale nie jak właściwość jest ustawiona?

To wydaje mi się złym pomysłem. Możesz mieć ustawienie określające wartość _myVar, ale programista końcowy konstruuje element pobierający, który czyta _someOtherVar. Powiedział, że nie wiem, jaki jest twój przypadek użycia, więc jest bardzo prawdopodobne, że czegoś mi brakuje.

Niezależnie od tego, myślę, że to przed pytanie może pomóc: Why is it impossible to override a getter-only property and add a setter?

1

mogę być nieporozumienia coś ale jeśli Dictionary będzie readonly trzeba wdrożyć otoki aby upewnić się, że jest naprawdę readony (nieruchomość indeksowane słownika nie jest wirtualny więc nie można przesłonić jego zachowanie), w którym to przypadku można wykonać następujące czynności:

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

    public virtual TValue this[TKey key] 
    { 
     get 
     { 
      return innerDictionary[key]; 
     } 
     private set 
     { 
      innerDictionary[key] = value; 
     } 
    } 
} 
Powiązane problemy