2017-09-14 7 views
-1

Im folgenden Code habe ich eine Eigenschaft in der Basisklasse, die eine Liste von benutzerdefinierten Objekten zurückgibt. In der Elternklasse überschreibe ich diese Eigenschaft und in der Definition der Überschreibung greife ich auf den Verweis auf die Liste der benutzerdefinierten Objekte aus der Basisklasse zu und füge 2 Objekte hinzu.Überschreiben der Basiseigenschaft und Zugreifen auf die Referenz in der Basis

Bevor ich zurückkomme, setze ich einen Haltepunkt in den Code und überprüfe den Inhalt der Basiseigenschaft und bemerke, dass die zwei neuen Objekte nicht da sind. Dann habe ich versucht, den Verweis auf die Liste der Objekte in der Basisklasse lokal zu speichern und fügte zwei Objekte in der Liste wieder hinzu. Ich stelle fest, dass in der lokalen Referenz die 2 neuen Objekte hinzugefügt wurden.

Allerdings zeige ich mit beiden Methoden auf die gleiche Referenz, so dass ich in der Lage sein sollte, Objekte hinzuzufügen, indem ich auf die base.TestProperty verweise. Irgendeine Idee, warum das nicht funktioniert?

public override List<CustomObject> TestProperty 
{ 
    get 
    { 
     List<CustomObject> temp = base.TestProperty; 

     CustomObject obj1 = new CustomObject() 
     { 
      Name = "My Name" 
     }; 

     CustomObject obj2 = new CustomObject() 
     { 
      Name = "Your Name" 
     }; 

    // Adding to the base list 
     base.TestProperty.Add(obj1); 
     base.TestProperty.Add(obj2); 

    // Adding to temp list, which still points to the base list 
     temp.Add(obj1); 
     temp.Add(obj2); 

    // Base object doesnot contain obj1 and obj2, but the temp object does. 
     return base.TestProperty; 
    } 
} 
+3

Implementierung von base.TestProperty pls – Will

+3

Klingt wie base.TestProperty 'neue Liste zurück ()'. –

+0

Sie haben nicht genügend Code zur Verfügung gestellt, um das beschriebene Problem zu reproduzieren. – Servy

Antwort

0

Dies ist nicht wirklich die spezifische Antwort, die Sie suchen, aber ... Sie sollten Ihr Design wirklich überdenken.

Sie haben eine Eigenschaft in Ihrer Unterklasse ... und erhalten diese Eigenschaft ändert die Werte Ihrer Klasse. Das ist extrem contraintuitive. Es ist nicht wie man erwarten würde:

Color bgCol = Color.Red; 
int red = bgCol.R; 

... die zweite Aussage zu Änderungswerten Ihrer Variable nur durch ein seine Eigenschaften zugreifen! Wie verwirrt wären Sie, wenn der Inhalt von bgCol bei der Ausführung dieser zweiten Anweisung in gelb geändert würde?

Mein Rat? Lassen Sie die Basisklasse zurückgeben, was sie eigentlich sein soll - vergessen Sie die Unterklasse. Und wenn Ihre Unterklasse diesem Ergebnis Werte hinzufügen muss? Fügen Sie dann die Werte hinzu, wenn die Eigenschaft der Unterklasse aufgerufen wird - , aber nur zu dem Ergebnis, dass sie zurückgeht - haben Sie keine Probleme mit den Eigenschaften des Basisobjekts.

public override List<CustomObject> TestProperty 
{ 
    get 
    { 
     List<CustomObject> objectsFromBase = base.TestProperty; 
     List<CustomObject> objectsFromThisClass = GetMySubclassCustomObjects(); 
     List<CustomObject> retVal = new List<CustomObject>(); 
     retVal.AddRange(objectsFromBase); 
     retVal.AddRange(objectsFromSubclass); 
     return retVal; 
    } 
} 
private List<CustomObject> GetMySubclassCustomObjects() 
{ 
    // your code for those two CustomObjects, and returning them from a list 
} 
+0

Danke für Ihre Erklärung, aber die Aussage, die Ed Plunkett gemacht hat, ist genau die Antwort auf meine Frage. Die Basisklasse befand sich in einer kompilierten Binärdatei. Ohne auf die Implementierung zu achten, nahm ich an, dass sie jedes Mal dieselbe Liste verwendete. –

Verwandte Themen