2017-03-26 5 views
0

Im folgenden Code muss ich Base Klassenkonstruktor Derived Klasseneigenschaft ServiceUrl verwenden. Ich kann ServiceUrl nicht als statisch definieren, da sein Wert basierend auf Derived Klassenkonstruktorargument berechnet wird. Ich kann nicht ServiceUrl als Konstruktorargument zu Base Klasse übergeben, da die Berechnung nicht so trivial ist wie dargestellt und es möglicherweise Zugriff auf andere Felder in Base/Derived Klassen erfordern.Verwenden Sie abgeleitete Klasseneigenschaft im Basisklassenkonstruktor

Irgendwelche Vorschläge für den besten Ausweg? Ich habe die Erlaubnis, Änderungen an Base und Derived Klassenstrukturen vorzunehmen, um den Zweck zu erreichen.

abstract class Base 
{ 
    public abstract string ServiceUrl { get; } 

    public Base() 
    { 
     Console.WriteLine(ServiceUrl); 
    } 
} 

class Derived : Base 
{ 
    public override string ServiceUrl { get; private set; } 

    public Derived(string rootUrl) : base() 
    { 
     ServiceUrl = rootUrl + "/service"; 
    } 
} 
+2

Muss es auf dem Konstruktor sein? weil du zuerst den Basiskonstruktor aufruft und nur dann kannst du den Kram in deinem Konstruktor starten ... –

+0

Ja. Ich denke auch, dass das Übergeben an den Konstruktor ein gesunder Menschenverstand für diese Situation ist. Ich kann den Basisklassenkonstruktor wahrscheinlich als 'base (GetServiceUrl())' nennen, der 'ServiceUrl' intern setzt und seinen Wert zurückgibt. –

Antwort

2

Der Basisklassenkonstruktor wird immer vor dem abgeleiteten Klassenkonstruktor aufgerufen. Daher gibt es genau zwei Lösungen:

  1. einen Parameter im Konstruktor Ihrer Basisklasse verwenden:

    abstract class Base 
    { 
        public string ServiceUrl { get; } 
    
        public Base(string serviceUrl) 
        { 
         ServiceUrl = serviceUrl; 
    
         Console.WriteLine(ServiceUrl); 
        } 
    } 
    
    class Derived : Base 
    { 
        public Derived(string rootUrl) : base(rootUrl + "/service") 
        { 
        } 
    } 
    
  2. die Variable nicht im Konstruktor anwenden. Verwenden Sie es zu einem späteren Zeitpunkt.
+0

Schöne Idee .. Ich sollte 'ServiceUrl' als nicht-abstrakte Eigenschaft in der Basisklasse machen. –

Verwandte Themen