Question

J'ai une classe de base "Parent" comme ceci:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Parent
    {
        private int parentVirtualInt = -1;
        public virtual int VirtualProperty
        {
            get
            {
                return parentVirtualInt;
            }
            set
            {
                if(parentVirtualInt != value)
                {
                    parentVirtualInt = value;
                }
            }
        }
    }
}

et une classe enfant comme ceci:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Child : Parent
    {
        public override int VirtualProperty
        {
            get
            {
                if(base.VirtualProperty > 0)
                {
                    throw new ApplicationException("Dummy Ex");
                }
                return base.VirtualProperty;
            }
            set
            {
                if(base.VirtualProperty != value)
                {
                    base.VirtualProperty = value;
                }
            }
        }
    }
}

Notez que le getter enfant appelle le getter du parent (ou du moins est-ce que je veux).

Je l'utilise maintenant la classe « enfant » par instancier, attribuer une valeur (disons 4) à son VirtualProperty puis lire la propriété à nouveau.

Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);

Quand je cours, je reçois un évidemment ApplicationException disant « factice Ex ». Mais si je mets un point d'arrêt sur la ligne

if(base.VirtualProperty > 0)

l'enfant et vérifier la valeur de base.VirtualProperty (en plaçant le curseur de la souris dessus) avant que l'exception peut être levée (je suppose (d)), je reçois déjà l'exception. De cela, je transmets que la déclaration base.VirtualProperty dans le « enfant-Getter appelle lui-même »; en quelque sorte.

Ce que je voudrais atteindre est le même comportement que je reçois quand je change la définition de parentVirutalInt (à Parent) à protéger et utiliser base.parentVirtualInt dans le Getter de l'enfant au lieu de base.VirtualProperty. Et je ne vois pas encore pourquoi cela ne fonctionne pas. Quelqu'un peut-il éclairer à ce sujet? Je pense que les propriétés surchargées se comportent différemment des méthodes surchargées?

Soit dit en passant. Je suis en train de faire quelque chose de très similaire avec une classe sous-classement, je n'ai aucun contrôle sur (ce qui est la principale raison pour laquelle ma « solution » est pas une option)

Cordialement

Était-ce utile?

La solution

Il est (sans doute) un bogue dans le débogueur. Vous pouvez ajouter votre vote à cette article de commentaires . Ce n'est pas facile à corriger, je suis sûr, le débogueur n'a pas accès prêt à l'adresse getter de propriété de base depuis la fente v-table pour le getter de la propriété a été remplacée dans la classe dérivée.

Une solution possible est de stocker la valeur de base dans une variable locale d'abord si vous pouvez vérifier que celui-ci. Cela ne va pas faire votre getter plus lentement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top