2009-03-26 6 views
0

Учитывая мой код ниже, существует способ, которым первый конструктор 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

Вы можете переключить логический круг, как это:

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

Я не уверен, что это сработает? Не попытается ли он вызвать WebTestingApp (Result, BrowserApp) с экземплярами IRemoteFile и IWebServiceGateway? –

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