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

C#代码:

public class B
{
    private int _i;
    private float _f;
    public B()
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i)
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i, float f)
    {
        _i = i;
        _f = f;
    }
}

F#代码:

type D() =
    inherit B()
    //how to inherit from other constructors ?

由于

有帮助吗?

解决方案

我找到了一种方法,这要归功于博客

type D =
    class
        inherit B

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

是的,这有点麻烦,但就像Brian说的那样,这不是大多数情况。

编辑: 实际上,类/结束关键字并不是强制性的(因此我收回了我所说的关于繁琐的内容)。 正如Brian在他的博客这里所说,F#通常会推断被定义的类型,使这些令牌不必要/多余。

type D =
    inherit B

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

其他提示

来自docs:"基类构造函数的参数出现在inherit子句的参数列表中。例如:

type D(i: int) =
   inherit B(i)

我不确定你是否可以从不同的F#构造函数调用不同的基类构造函数,因为F#要求所有构造函数都通过“primary”构造函数。构造函数(因为主构造函数参数在整个类的范围内,因此必须初始化它们)。在你的情况下,你可以逃脱它,因为你的基类有一个最大的构造函数:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top