在F#中键入继承

Str*_*ger 4 inheritance f# c#-to-f#

我找不到用于编码继承基类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;
    }
}
Run Code Online (Sandbox Code Playgroud)

F#代码:

type D() =
    inherit B()
    //how to inherit from other constructors ?
Run Code Online (Sandbox Code Playgroud)

谢谢

Str*_*ger 6

我找到了办法,感谢这个博客!

type D =
    class
        inherit B

        new () = {
            inherit B()
        }
        new (i : int) = {
            inherit B(i)
        }
        new ((i,f) : int*single) = {
            inherit B(i, f)
        }
    end
Run Code Online (Sandbox Code Playgroud)

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

编辑:实际上,类/结束关键字不是强制性的(因此我收回我所说的关于繁琐的内容).布赖恩在他的博客中说:在这里,F#通常推断所定义的那种类型,使得这些令牌不必要/冗余.

type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }
Run Code Online (Sandbox Code Playgroud)


ito*_*son 5

从文档:"基类构造函数的参数出现在inherit子句的参数列表中." 例如:

type D(i: int) =
   inherit B(i)
Run Code Online (Sandbox Code Playgroud)

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

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)
Run Code Online (Sandbox Code Playgroud)

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

  • 可以让不同的派生类构造函数调用不同的基础构造函数,但仅限于切换到"显式"类语法时.我稍后会尝试发布一个这样的例子.无论如何,这是一个很好的答案,涵盖97%的情况. (2认同)