繁体   English   中英

在F#中实现字典子类

[英]Implementing dictionary subclass in F#

我是.Net世界的新手,我试图弄清楚继承和接口的工作原理。 我正在尝试实现一个Dictionary<string,string> ,将所有键都保留为大写字符串。 在F#中,我的第一个幼稚的刺是

type UpperDictionary1() = 
    inherit Dictionary<string, string>()
    override this.Add (key: string, value : string) =
        base.Add(key.ToUpper(), value)

那是行不通的,因为Dictionary Add是密封的。 但是,删除覆盖(并添加阴影作为替代?)是可行的:

type UpperDictionary2() = 
    inherit Dictionary<string, string>()
    member this.Add (key: string, value : string) = 
        base.Add(key.ToUpper(), value)

实现特殊形式的字典类的最快,最合适的方法是什么?

而且,这是否与Java中的Google ForwardingSet有关。 转发集是添加这种功能的简单方法吗?还是我完全忘记了要点?

我认为您想要在这里实现IDictionary接口。 这样,您就可以与自己作为IDictionary的类型进行交互(添加,删除等),并且您可以将大多数呼叫转发给私有的Dictionary成员。

也检查一下

我真的不认为将所有这些接口都实现为最佳实践,并且即使它可以编译,我也高度怀疑它是否正确。 我建议只创建自己的界面。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM