覆盖F#中的构造函数

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)

丰富

kvb*_*kvb 5

我不确定我理解你的问题; 你上面写的内容看起来应该很好.如果你问的是把构建器逻辑的其余部分放到哪里,试试这个:

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)


Tom*_*cek 5

您的 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)