Inheritance F中的类型继承#

Inheritance F中的类型继承#,inheritance,f#,c#-to-f#,Inheritance,F#,C# To F#,我找不到正确的语法来编码继承基类B(用C#编写)及其构造函数(基类隐式构造函数除外)的类型D: type D(i : int, f : float) = inherit B(i, f) new(i : int) = D(i, 0.0) new() = D(0, 0.0) C#代码: F#代码: 感谢文档:“基类构造函数的参数出现在inherit子句的参数列表中。”例如: type D(i: int) = inherit B(i) 我不确定是否可以从不同的F#构造函数调用不同

我找不到正确的语法来编码继承基类B(用C#编写)及其构造函数(基类隐式构造函数除外)的类型D:

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)
C#代码:

F#代码:

感谢文档:“基类构造函数的参数出现在inherit子句的参数列表中。”例如:

type D(i: int) =
   inherit B(i)
我不确定是否可以从不同的F#构造函数调用不同的基类构造函数,因为F#要求所有构造函数都经过“主”构造函数(因为主构造函数参数在整个类的作用域内,所以必须对它们进行初始化)。在您的情况下,您可以不受影响,因为您的基类有一个最大构造函数:

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)

但是对于没有最大构造函数的基类,我不确定这是否可行。

我找到了一种方法,谢谢

是的,这有点麻烦,但正如布赖恩所说,这不是大多数情况

编辑: 实际上,class/end关键字并不是必须的(所以我收回我所说的笨重)。 正如Brian在他的博客上所说,F#通常会推断所定义的类型,这使得这些标记不必要/多余

type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }

但是如何继承多个构造函数呢?我已经更新了答案来讨论这个问题(虽然我在这里再次指出了我自己知识的局限性,所以如果我错了,希望其他人会插话…)。有可能让不同的派生类构造函数调用不同的基构造函数,但仅当切换到“显式”类语法时。稍后我将尝试发布一个这样的示例。无论如何,这是一个很好的答案,涵盖了97%的情况。顺便说一句,如果你仔细看B的第二个构造函数,它将_i和_f初始化为0值,这是我故意做的。因此,当使用new(i:int)=D(i,0.0)时,基类的行为将被破坏。。
type D =
    class
        inherit B

        new () = {
            inherit B()
        }
        new (i : int) = {
            inherit B(i)
        }
        new ((i,f) : int*single) = {
            inherit B(i, f)
        }
    end
type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }