2010-04-02 148 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