0

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

答えはコンストラクターチェーンと関係があると思いますが、2番目の WebTestingApp コンストラクターが暗黙的に base() を呼び出すため、その方法がわかりません (クラスの外部ユーザーが持つべきではないため、これは重要です) IRemoteFile および IWebServiceGateway インスタンスを提供します)。

    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 のコンストラクターは次のとおりです。

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

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

WebTestingApp は TestingApp から派生しています。S3File と WebServiceGateway はシングルトンです。

4

2 に答える 2

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)
{
}

両方のクラスでシングルトンへの呼び出しが重複するため、これも完璧な解決策ではありません。

于 2009-03-26T16:47:11.897 に答える