如何在F#中编写以下C#代码?
namespace Shared {
public class SharedRegistry : PageRegistry {
public SharedRegistry(bool useCache = true)
: base(useCache) {
// Repositories
ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>();
ForRequestedType<ISharedEnquiryRepository>().TheDefaultIsConcreteType<SharedEnquiryRepository>();
// Services
ForRequestedType<IAddressService>().TheDefaultIsConcreteType<AddressService>();
ForRequestedType<ISharedEnquiryService>().TheDefaultIsConcreteType<SharedEnquiryService>();
}
}
}
就我所管理的情况而言,但在声明我自己的默认构造函数的同时,我无法继续从PageRegistry
继承。
type SharedRegistry(useCache: bool) =
inherit PageRegistry(useCache)
new() = new SharedRegistry(true)
富
答案 0 :(得分:5)
我不确定我理解你的问题;你上面写的内容看起来应该很好。如果你问的是把构建器逻辑的其余部分放到哪里,试试这个:
type SharedRegistry(useCache) as this =
inherit PageRegistry(useCache)
do
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
new() = SharedRegistry(true)
如果你想单独定义每个构造函数,你也可以这样做:
type SharedRegistry =
inherit PageRegistry
new(useCache) as this =
{ inherit PageRegistry(useCache) } then
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
new() = SharedRegistry(true)
或者,您可以对主构造函数使用可选参数:
type SharedRegistry(?useCache) as this =
inherit PageRegistry(defaultArg useCache true)
do
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
答案 1 :(得分:4)
您的C#类使用默认值的参数,该默认值与重载的构造函数略有不同。在任何情况下,F#都支持重载的构造函数和默认参数。
使用参数的默认值,代码如下所示:
type SharedRegistry(?useCache: bool) =
do
// constructor logic
inherit PageRegistry(defaultArg useCache true)
现在您可以按如下方式创建实例:
let r1 = new SharedRegistry() // using the default value
let r2 = new SharedRegistry(false) // specified explicitly
let r3 = new SharedRegistry(useCache=false) // using named parameter
我相信在F#中使用命名参数稍微优雅一点。它的工作方式是参数useCache
成为封面下的option<bool>
(如果您想使用C#中的类,这可能会有问题)
关于重载的构造函数 - 您的F#代码应该是正确的(请参阅 kvb 的答案)。通常,最好至少有一个隐式构造函数(因为它允许您自动访问类体内的构造函数参数,使用let
声明字段并使用do
实现构造函数逻辑) 。隐式构造函数应该是获取所有参数的构造函数。在某些情况下,您可能希望将其设为私有,可以这样做:
type SharedRegistry private (useCache: bool) =
inherit PageRegistry(useCache)
do
// constructor logic
new () = SharedRegistry(true)