在F#中实现字典子类

时间:2009-11-23 18:49:00

标签: c# .net f#

我是.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有关。转发集只是添加此类功能的一种更简单的方法,还是我完全忽略了这一点?

2 个答案:

答案 0 :(得分:3)

我认为你想要的是实现IDictionary接口。这将允许您作为IDictionary(添加,删除等)与您的类型进行交互,您可以将大多数调用转发给私人词典成员。

Check this out也是。

答案 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>>