2009-03-26 4 views
0

Gegeben mein Code unten, gibt es eine Möglichkeit, dass der erste WebTestingApp-Konstruktor den zweiten aufrufen kann, bevor er die neue Instanz zurückgibt? Ich möchte einige schreibgeschützte Felder im Konstruktor setzen und, kurz vor dem Kopieren/Einfügen, kann ich nicht sehen, wie ich es kann.Konstruktor, der mit mehreren Anrufen verkettet

Ich glaube, dass die Antwort etwas mit Konstruktorverkettung zu tun haben wird, aber ich kann nicht herausfinden, wie es geht, da der zweite WebTestingApp-Konstruktor implizit base() aufruft (was als externe Benutzer der Klasse wichtig ist) sollte keine IRemoteFile- und IWebServiceGateway-Instanzen bereitstellen müssen).

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 
    } 

Hier ist die Basisklasse TestingApp des Konstrukteurs:

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

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

WebTestingApp von TestingApp abgeleitet ist. S3File und WebServiceGateway sind Singletons.

Antwort

2

Sie konnten die Logik Runde wie dieser Schalter:

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

Dies ist entweder keine perfekte Lösung, da sie die Anrufe an die Singletons in beiden Klassen dupliziert.

+0

Ich bin mir nicht sicher, dass das funktionieren würde? Würde es nicht versuchen, WebTestingApp (Result, BrowserApp) mit IRemoteFile und IWebServiceGateway-Instanzen aufzurufen? –

+0

Ich habe Ihre Frage falsch gelesen. Entschuldigung. Wird meine Antwort bearbeiten. –

+0

Edited Mine, dann sah, dass Sie mit dem gleichen kommen würden. Naja, froh, dass du sortiert bist ... –

0

Entschuldigung, ich denke, ich könnte die Antwort gefunden haben, indem ich sie umschalte und den zweiten Konstruktor den ersten mit den standardmäßigen IRemoteFile und IWebServiceGateway-Instanzen aufrufen lasse und alle 4 Konstruktoren einbeziehe.

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