覆盖F#中的构造函数

时间:2010-04-02 13:22:07

标签: f# constructor override

如何在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)

2 个答案:

答案 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)