2010-04-02 86 views
4

如何在F#中编写以下C#代码?F#中的重写构造函数#

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) 

丰富

回答

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. 
+0

我有“do”和“new”行错误的方式。谢谢你的帮助。 – kim3er 2010-04-02 14:11:34

+0

我必须做的唯一修正是将它们返回类型时,将它们包装在Ignore()方法中。 – kim3er 2010-04-02 18:12:27

+0

@ kim3er - 是的,如果您调用返回值的函数,那么您需要忽略它。在调用之后使用'|> ignore'可能比将ignore放在'ignore(...)'中更习惯于使用'ignore>,但这些方法的命名非常详细,以至于这两个选项看起来都不那么好。 – kvb 2010-04-02 18:21:01

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) 
+0

+1不完全是我之后的事,但你确实回答了我的另一个问题。 – kim3er 2010-04-02 14:12:39

+0

一个小小的挑逗......构造函数体中额外的'new'是无害的;就像在F#中的大多数情况下一样,这不是必需的,但是如果需要的话可以明确地使用。 – kvb 2010-04-02 14:16:34

+0

@kvb:啊,我不知道。感谢您的更正! – 2010-04-02 14:18:53