2017-09-14 8 views
-1

Dans le code ci-dessous, j'ai une propriété dans la classe de base qui renvoie une liste d'objets personnalisés. Dans la classe parent, je substitue cette propriété et dans la définition du remplacement, j'accède à la référence à la liste des objets personnalisés de la classe de base et y ajoute 2 objets.Substitution de la propriété de base et accès à la référence dans la base

Avant de retourner, je mets un point d'arrêt dans le code et vérifie le contenu de la propriété de base et remarque que les deux nouveaux objets ne sont pas là. Ensuite, j'ai essayé de stocker la référence à la liste des objets de la classe de base localement et ajouté à nouveau deux objets dans la liste. Je remarque que dans la référence locale les 2 nouveaux objets ont été ajoutés. Cependant, en utilisant les deux méthodes, je pointe vers la même référence, donc je devrais être capable d'ajouter des objets en me reportant à la base.TestProperty. Une idée de pourquoi ça ne marchera pas?

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

mise en œuvre de base.TestProperty pls – Will

+3

Ressemble retourne base.TestProperty 'nouvelle liste ()'. –

+0

Vous n'avez pas fourni assez de code pour reproduire le problème que vous avez décrit. – Servy

Répondre

0

Ce n'est pas vraiment la réponse spécifique que vous cherchez, mais ... vous devriez vraiment reconsidérer votre conception.

Vous avez une propriété dans votre sous-classe ... et obtenant cette propriété modifie les valeurs de votre classe. C'est extrêmement contre-intuitif. Il est pas comme vous attendez:

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

... cette deuxième déclaration à pour modifier les valeurs de votre variable simplement en accédant à l'une de ses propriétés! À quel point seriez-vous confus si, lors de l'exécution de cette deuxième déclaration, il modifiait le contenu de bgCol en jaune?

Mon conseil? Demandez à la classe de base de retourner ce qu'elle est censée faire - en oubliant la sous-classe. Et si votre sous-classe a besoin d'ajouter des valeurs à ce résultat? Ensuite, il faut ajouter les valeurs lorsque la propriété de la sous-classe est appelée - mais seulement pour le résultat, il est de retour - ne pas du tout gâcher avec les propriétés de l'objet de base du tout.

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

Merci pour votre explication, mais la déclaration faite par Ed Plunkett est exactement la réponse à ma question. La classe de base était dans un binaire compilé donc sans regarder son implémentation je supposais qu'elle utilisait la même liste à chaque fois. –