Type inheritance in F#

谁说胖子不能爱 提交于 2019-12-05 14:38:26

I found a way to do it thanks this blog !

type D =
    class
        inherit B

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

Yes, it's a bit cumbersome, but like Brian said it's not the majority of the cases.

EDIT: Actually, class/end keywords are not mandatory for that (so I take back what i said about cumbersomeness). As Brian said on his blog here, F# normally infers the kind of type being defined, making these tokens unnecessary/redundant.

type D =
    inherit B

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

From the docs: "The arguments for the base class constructor appear in the argument list in the inherit clause." For example:

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

I am not sure if you can call different base class constructors from different F# constructors, because F# requires all constructors to go through the "primary" constructor (because the primary constructor arguments are in scope for the entire class, so they have to be initialised). In your case, you can get away with it because your base class has a maximal constructor:

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

But for a base class without a maximal constructor I'm not sure this is possible.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!