私は特別なタイプの辞書を持っています。これを正確に行う方法はわかりませんが、getメソッドを仮想化することを検討していますが、setメソッドは作成していません。
public TValue this[TKey key]
{
get { ... }
set { ... }
}
それは可能ですか?もしそうなら、正しい組み合わせは何ですか?
私は特別なタイプの辞書を持っています。これを正確に行う方法はわかりませんが、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 { ... }
}
申し訳ありません...C#でこれを行うための構文はありませんが、代わりにこれを行うことができます。
public TValue this[TKey key]
{
get { return GetValue(key) }
set { ... }
}
protected virtual TValue GetValue(TKey key)
{
...
}
私は何かを誤解しているかもしれませんが、Dictionary
読み取り専用にする場合は、ラッパーを実装して、それが本当に読み取り可能であることを確認する必要があります(辞書のインデックス付きプロパティは仮想ではないため、その動作をオーバーライドすることはできません)。 :
public class ReadOnlyDictionary<TKey, TValue>
{
Dictionary<TKey, TValue> innerDictionary;
public virtual TValue this[TKey key]
{
get
{
return innerDictionary[key];
}
private set
{
innerDictionary[key] = value;
}
}
}
ここであなたがやろうとしていることは、プロパティの読み取り方法を定義する必要があるが、プロパティの設定方法を定義する必要がない状況を作成することだと思いますか?
これは悪い考えのように私を襲います。_myVarの値を設定する設定を行うこともできますが、エンド開発者は_someOtherVarを読み取るゲッターを作成します。とはいえ、あなたのユースケースが何であるかはわかりません。そのため、何かが足りない可能性が非常に高いです。
とにかく、この前の質問が役立つかもしれないと思います:なぜgetter-onlyプロパティをオーバーライドしてsetterを追加することが不可能なのですか?