Конструктор цепочки с несколькими вызовами - PullRequest
0 голосов
/ 26 марта 2009

Учитывая мой код ниже, есть ли способ, которым первый конструктор WebTestingApp может вызвать второй перед возвратом нового экземпляра? Я хочу установить в конструкторе несколько полей только для чтения, и, если не считать копирования / вставки, я не вижу, как это сделать.

Мне кажется, что ответ будет связан с цепочкой конструктора, но я не могу понять, как это сделать, поскольку второй конструктор 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 являются одиночными.

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Вы можете переключить логику следующим образом:

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 голосов
/ 26 марта 2009

Извините, я думаю, что мог бы найти ответ, переключив их и заставив второй конструктор вызвать первый с экземплярами 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) {}
...