2011-07-11 4 views
6

私は特別なタイプの辞書を持っています。私はまさにこれを実行するかどうかはわかりませんが、私はgetメソッドは、仮想作るために探していますが、ない設定方法:C#Indexerプロパティ - getメソッドとsetメソッドを仮想化する方法はありますか?

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

ことが可能と正しい組み合わせはそう何である場合ですか?

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

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

:辞書のインデックス付きプロパティを使用すると、次の操作を行うことができ、その場合には)ので、あなたがその動作をオーバーライドすることはできません仮想ではありませんゲッターだけを「仮想」にしますか?それを行うためのより良い方法があるかもしれません。 –

+0

私の "ReadOnlyDictionary"を拡張できるようにしようとしています。これは読み取り専用の辞書なのでsetメソッドはサポートされていません(例外がスローされます)。しかし、拡張クラスはgetメソッドから追加の作業を行いたいので、オーバーライドして変更することができます。 –

+0

"get"メソッドを仮想化しようとするよりも、代わりにいくつかの仮想 "OnGetCalled"メソッドを持ち、それを上書きする派生クラスにするべきではありません。派生クラスはBaseバージョンを呼び出さずに "get"(つまりMarkの提案によって)をオーバーライドすることができないので、別のメソッドはコントラクトを明示的にします。 –

答えて

12

あなたは直接がそれを行うことはできません。

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

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

+1を10秒で打つ。 –

+0

Nevermind、my fault。ごめんなさい。私が念頭に置いていた解決策は、明らかにセッターをプライベートにしました。それでも、コレクションが読み込み専用であれば、私はその問題を見ることはできませんが、それは別の解決策です。 – InBetween

6

は申し訳ありませんが... C#でこれを行うための構文はありませんが、あなたの代わりにこれを行うことができます:あなたは別のメソッドを追加する必要があります -

0

私は、彼らはプロパティが設定されていないどのようにプロパティが読み込まれる方法を定義する必要がありますが、状況を作成するには、ここで何をしようとしてされたと仮定していますか?

これは私を悪い考え方に襲います。 _myVarの値を設定することができますが、開発者は_someOtherVarを読み取るゲッターを作成することができます。つまり、あなたのユースケースが何であるかわからないので、私は何かが欠けている可能性が非常に高いです。

かかわらず、私はこの前の質問が役立つかもしれないと思う:私は何かを誤解される可能性がありますWhy is it impossible to override a getter-only property and add a setter?

1

が、あなたのDictionaryが読み取り専用あることを行っている場合は、それを確保するためにラッパーを実装する必要が本当にreadonyです(あなたがすることによって達成したいん何

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

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