kim*_*3er 4 f# constructor overriding
我如何在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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
就我所管理的而言,但我无法PageRegistry在声明我自己的默认构造函数的同时继承.
type SharedRegistry(useCache: bool) =
inherit PageRegistry(useCache)
new() = new SharedRegistry(true)
Run Code Online (Sandbox Code Playgroud)
丰富
我不确定我理解你的问题; 你上面写的内容看起来应该很好.如果你问的是把构建器逻辑的其余部分放到哪里,试试这个:
type SharedRegistry(useCache) as this =
inherit PageRegistry(useCache)
do
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
new() = SharedRegistry(true)
Run Code Online (Sandbox Code Playgroud)
如果要单独定义每个构造函数,也可以这样做:
type SharedRegistry =
inherit PageRegistry
new(useCache) as this =
{ inherit PageRegistry(useCache) } then
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
new() = SharedRegistry(true)
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用主构造函数的可选参数:
type SharedRegistry(?useCache) as this =
inherit PageRegistry(defaultArg useCache true)
do
this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>()
// etc.
Run Code Online (Sandbox Code Playgroud)
您的 C# 类使用具有默认值的参数,这与重载的构造函数略有不同。在任何情况下,F# 都支持重载构造函数和默认参数。
使用参数的默认值,代码如下所示:
type SharedRegistry(?useCache: bool) =
do
// constructor logic
inherit PageRegistry(defaultArg useCache true)
Run Code Online (Sandbox Code Playgroud)
现在您可以创建一个实例,如下所示:
let r1 = new SharedRegistry() // using the default value
let r2 = new SharedRegistry(false) // specified explicitly
let r3 = new SharedRegistry(useCache=false) // using named parameter
Run Code Online (Sandbox Code Playgroud)
我相信在 F# 中使用命名参数稍微优雅一些。它的工作方式是参数useCache变成option<bool>隐藏的(如果您想使用 C# 中的类,这可能是一个问题)
关于重载的构造函数- 您的 F# 代码应该是正确的(请参阅kvb的答案)。一般来说,最好至少有一个隐式构造函数(因为它允许您自动访问类体内的构造函数参数,使用声明字段let并使用实现构造函数逻辑do)。隐式构造函数应该是接受所有参数的构造函数。在某些情况下,您可能希望将其设为私有,可以这样做:
type SharedRegistry private (useCache: bool) =
inherit PageRegistry(useCache)
do
// constructor logic
new () = SharedRegistry(true)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1829 次 |
| 最近记录: |