2011-07-11 5 views
6

J'ai un type spécial de dictionnaire. Je ne sais pas comment faire exactement, mais je cherche à faire la méthode get virtuelle, mais pas la méthode de jeu:C# Propriétés de l'indexeur - Une manière de virtualiser la méthode get et non la set?

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

Est-il possible et si oui, quelle est la combinaison correcte?

+0

que voulez-vous atteindre par faire seulement le getter 'virtual'? Il pourrait y avoir une meilleure façon de faire cela. –

+0

Juste essayer de rendre possible d'étendre mon "ReadOnlyDictionary". Comme il s'agit d'un dictionnaire en lecture seule, je ne supporte pas la méthode set (une exception est lancée), mais une classe d'extension pourrait vouloir effectuer un travail supplémentaire à partir de la méthode get, donc ils pourraient le modifier et le modifier. –

+0

Vous ne devriez pas essayer de rendre la méthode "get" virtuelle, mais plutôt avoir une méthode virtuelle "OnGetCalled" et laisser la classe dérivée la surcharger. La classe dérivée ne pourra pas remplacer "get" (c'est-à-dire par la suggestion de Mark) sans appeler la version de base, donc une méthode séparée rendra le contrat explicite. –

Répondre

12

Vous ne pouvez pas faire directement - vous devez ajouter une méthode distincte:

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

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

+1 pour me battre de 10 secondes –

+0

Nevermind, ma faute. Pardon. La solution que j'avais en tête a évidemment rendu le setter privé. Pourtant, si la collection est en lecture seule, je ne vois pas le problème mais c'est une solution différente. – InBetween

6

Désolé ... Il n'y a pas de syntaxe pour faire cela en C#, mais vous pouvez le faire à la place .

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

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

Je suppose que vous essayez de faire ici est de créer une situation où ils doivent définir la façon dont la propriété est en lecture mais pas comment la propriété est définie?

Cela me semble être une mauvaise idée. Vous pouvez avoir un paramètre définissant la valeur de _myVar mais le développeur final construisant un getter qui lit _someOtherVar. Cela dit, je ne sais pas quel est votre cas d'utilisation, il est donc très probable qu'il me manque quelque chose.

Quoiqu'il en soit, je pense que cette question préalable pourrait aider: Why is it impossible to override a getter-only property and add a setter?

1

je pourrais être mal compris quelque chose, mais si votre Dictionary va être readonly vous devez mettre en œuvre une enveloppe pour assurer qu'il est vraiment readony (propriété indexée du dictionnaire n'est pas virtuel vous ne pouvez donc pas passer outre son comportement) dans ce cas, vous pouvez effectuer les opérations suivantes:

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

    public virtual TValue this[TKey key] 
    { 
     get 
     { 
      return innerDictionary[key]; 
     } 
     private set 
     { 
      innerDictionary[key] = value; 
     } 
    } 
} 
Questions connexes