我是.Net世界的新手,我正试图弄清楚继承和接口是如何工作的。我正在尝试实现一个Dictionary<string,string>
,它将所有键保存为大写字符串。在F#我的第一次天真刺是
type UpperDictionary1() =
inherit Dictionary<string, string>()
override this.Add (key: string, value : string) =
base.Add(key.ToUpper(), value)
这不起作用,因为字典添加是密封的。但是,删除覆盖(和阴影添加而不是?)有效:
type UpperDictionary2() =
inherit Dictionary<string, string>()
member this.Add (key: string, value : string) =
base.Add(key.ToUpper(), value)
实现特殊形式的字典类的最快和最合适的方法是什么?
此外,这是否与Java中的Google ForwardingSet有关。转发集只是添加此类功能的一种更简单的方法,还是我完全忽略了这一点?
答案 0 :(得分:3)
我认为你想要的是实现IDictionary接口。这将允许您作为IDictionary(添加,删除等)与您的类型进行交互,您可以将大多数调用转发给私人词典成员。
答案 1 :(得分:0)
我真的不认为实现所有这个界面是最佳实践,我非常怀疑即使它编译也是正确的。我建议你自己创建一个界面。
type UpperDictionary() =
let dictionary = new Dictionary<String, String>()
interface IDictionary<string, string> with
member this.Add(key: string, value : string) = dictionary.Add(key.ToUpper(), value)
member this.Add(kvp) = dictionary.Add(kvp.Key.ToUpper(), kvp.Value)
member this.ContainsKey(key) = dictionary.ContainsKey(key.ToUpper())
member this.Contains(kvp) = dictionary.TryGetValue(kvp.Key.ToUpper(), ref kvp.Value)
member this.Item with get key = dictionary.Item(key) and set key value = dictionary.Item(key) <- value
member this.Count with get() = dictionary.Count
member this.IsReadOnly with get() = false
member this.Keys = dictionary.Keys :> ICollection<String>
member this.Remove key = dictionary.Remove(key)
member this.Remove(kvp : KeyValuePair<String,String>) = dictionary.Remove(kvp.Key.ToUpper())
member this.TryGetValue(key, value) = dictionary.TryGetValue(key, ref value)
member this.Values = dictionary.Values :> ICollection<String>
member this.Clear() = dictionary.Clear()
member this.CopyTo(array, arrayIndex) = (dictionary :> IDictionary<string, string>).CopyTo(array, arrayIndex)
member this.GetEnumerator() = dictionary.GetEnumerator() :> IEnumerator
member this.GetEnumerator() = dictionary.GetEnumerator() :> IEnumerator<KeyValuePair<String,String>>