代码之家  ›  专栏  ›  技术社区  ›  Tristan

在f中实现字典子类#

  •  1
  • Tristan  · 技术社区  · 15 年前

    我刚接触到.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)
    

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

    另外,这与谷歌的 ForwardingSet 在Java中。转发集是添加此类功能的简单方法,还是完全忽略了这一点?

    2 回复  |  直到 15 年前
        1
  •  3
  •   emptyset    15 年前

    我认为您希望在这里实现IDictionary接口。这将允许您作为IDictionary(添加、删除等)与您的类型进行交互,并且您可以将大部分调用转发给私有字典成员。

    Check this out 也是。

        2
  •  0
  •   gradbot    15 年前

    我真的不认为实现所有这些接口都是最佳实践,我非常怀疑它是否都是正确的,即使它是编译的。我建议你做自己的界面。

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