inheritance - F# 添加多个调用基类构造函数的构造函数重载

标签 inheritance constructor f# constructor-overloading

我正在尝试在 F# 中创建结构相等的字典,并且希望传递多个字典构造函数重载。

在 C# 中,这看起来像

class StructuralDictionary<Key, Value> : Dictionary<Key, Value> where Key : IEquatable<Key>
{
    public StructuralDictionary() : base() { }
    public StructuralDictionary(IDictionary<Key, Value> dict) : base(dict) { }
    public StructuralDictionary(IEqualityComparer<Key> keyComparer) : base(keyComparer) { }
}

F# 文档有 section demonstrating this usecase ,但我无法编译它

type StructuralDictionary<'key, 'value when 'key:equality> =

    new (dictionary:IDictionary<'key,'value>) = { inherit Dictionary<'key,'value>(dictionary) }
    new () = { inherit Dictionary<'key, 'value> () }

最佳答案

如果要使用隐式构造函数语法,所有其他构造函数都必须调用隐式构造函数(并且最终会间接调用基类的相同构造函数)。

在您的示例中,您可以定义一个以 IDictionary 作为参数的隐式构造函数,并使用另一个构造函数中的空字典调用它:

type StructuralDictionary<'TKey, 'TValue when 'TKey:equality>
    (dictionary:IDictionary<'TKey, 'TValue>) =
  inherit Dictionary<'TKey, 'TValue>(dictionary)
  new () = StructuralDictionary(dict [])

与仅调用不带参数的基本构造函数(您分配一个空字典)相比,这可能会产生一些小开销,但它允许您使用隐式构造函数的所有其他方便功能,因此可能是值得的。

关于inheritance - F# 添加多个调用基类构造函数的构造函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75900935/

相关文章:

javascript - 指定 .constructor.name 为任意字符串

c++ - 在构造函数中初始化引用

c# - 在 C# 中编写 F# 递归文件夹访问者 - seq 与 IEnumerable

C++歧义问题

c++ - 在并行继承层次结构中由 parent 关联 child

C++: "error C4430: missing type specifier - int assumed"对于构造函数和析构函数的无效声明

F# - 反向管道顺序

f# - 我可以避免在 F# 中进行这种强制转换吗?

java - 实际对象的类型和对象引用之间的继承关系

javascript - JS 原型(prototype)继承的意外结果