2009-03-26 15 views
0

以下のコードでは、最初のWebTestingAppコンストラクタが新しいインスタンスを返す前に2番目のWebTestingAppコンストラクタが呼び出せる方法はありますか?私はコンストラクタにいくつかの読み取り専用フィールドを設定したいと思います。コピー/貼り付けが不十分なので、私はどのようにできるのか分かりません。複数の呼び出しで連鎖するコンストラクタ

答えはコンストラクタチェーンと何か関係がありますが、私はそれを行う方法を理解できません。なぜなら、2番目のWebTestingAppコンストラクタが暗黙的にbase()を呼び出すからです。(これはクラスの外部ユーザIRemoteFileインスタンスとIWebServiceGatewayインスタンスを提供する必要はありません)。 WebTestingAppはTestingAppから派生し

protected TestingApp() : this(S3File.Instance, WebServiceGateway.Instance) { } 

    internal TestingApp(IRemoteFile remoteFile, IWebServiceGateway webServiceGateway) 
    { 
     this.remoteFile = remoteFile; 
     this.webServiceGateway = webServiceGateway; 
    } 

internal WebTestingApp(Result result, BrowserApp browserApp, IRemoteFile remoteFile, IWebServiceGateway webServiceGateway) : base(remoteFile, webServiceGateway) 
    { 
     // TODO: Need to invoke WebTestingApp(Result result, BrowserApp browserApp) 
    } 

    public WebTestingApp(Result result, BrowserApp browserApp) 
    { 
     // Set readonly vars here 
    } 

ここでは、基本クラスTestingAppのコンストラクタです。 S3FileとWebServiceGatewayはシングルトンです。

答えて

2

あなたは、このような論理ラウンドを切り替えることができます:

internal WebTestingApp(Result result, BrowserApp browserApp, IRemoteFile remoteFile, IWebServiceGateway webServiceGateway) : base(remoteFile, webServiceGateway) 
{ 
    // Set readonly vars here 
} 

public WebTestingApp(Result result, BrowserApp browserApp) : this(result, browserApp, S3File.Instance, WebServiceGateway.Instance) 
{ 
} 

それは両方のクラスでのシングルトンへの呼び出しを複製し、これは、いずれかの完璧なソリューションではありません。

+0

どうすればよいでしょうか? IRemoteFileとIWebServiceGatewayのインスタンスでWebTestingApp(Result、BrowserApp)を呼び出そうとしませんか? –

+0

私はあなたの質問を誤解しました。謝罪。私の答えを編集します。 –

+0

編集された鉱山、それからあなたは同じものを考え出した。ああ、うれしいことに、あなたはソートされています... –

0

私は答えを見つけたかもしれないと思います。二番目のコンストラクタをデフォルトのIRemoteFileインスタンスとIWebServiceGatewayインスタンスで最初に呼び出すと、それらを連鎖させて4つのコンストラクタをすべて含めることができます。

internal WebTestingApp(Result result, BrowserApp browserApp, IRemoteFile remoteFile, IWebServiceGateway webServiceGateway) : base(remoteFile, webServiceGateway) 
    { 
     // Set readonly fields here 
    } 

    public WebTestingApp(Result result, BrowserApp browserApp) : this(result, browserApp, S3File.Instance, WebServiceGateway.Instance) {} 
関連する問題