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)
谢谢
我找到了办法,感谢这个博客!
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)
从文档:"基类构造函数的参数出现在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)
但对于没有最大构造函数的基类,我不确定这是可能的.