Domanda

Ho una classe base "Padre" come questo:

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;
                }
            }
        }
    }
}

e una classe di bambini di simile a questo:

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;
                }
            }
        }
    }
}

Nota che il getter nel Bambino è chiamare il richiamo di un Genitore (o almeno questo è ciò che intendo).

Io uso il "Bambino" di classe da istanziare, assegnare un valore (diciamo 4) per la sua VirtualProperty e quindi la lettura della proprietà di nuovo.

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

Quando ho eseguito questo, io, ovviamente, ottenere un ApplicationException dicendo "Dummy " Ex". Ma se posso impostare un punto di interruzione sulla linea

if(base.VirtualProperty > 0)

nel Bambino e controllare il valore di base.VirtualProperty (posizionando il mouse su di esso) prima di eccezione può essere gettato (Presumo(d)), ho già ottenere l'Eccezione.Da questo ho l'onore di trasmettere la dichiarazione base.VirtualProperty il "Bambino-Getter chiama se stesso";tipo di.

Quello che vorrei ottenere è lo stesso comportamento si ottiene quando si modifica la definizione di parentVirutalInt (Padre) per la protezione e l'uso base.parentVirtualInt il richiamo di Bambino invece di base.VirtualProperty.E io ancora non vedo perché questo non funziona.Qualcuno può far luce su questo?Sento che la proprietà sostituiti comportarsi in modo diverso rispetto a metodi sovrascritti?

A proposito:Sto facendo qualcosa di molto simile con una sottoclasse di una classe non ho alcun controllo su (questo è il principale motivo per cui la mia "soluzione" non è un'opzione).

Cordiali saluti

È stato utile?

Soluzione

È (probabilmente) un bug nel debugger.È possibile aggiungere il tuo voto per questo feedback articolo.Questo non è facile da risolvere, sono sicuro, il debugger non hanno facile accesso alle proprietà di base del metodo getter indirizzo a partire dal v tabella slot per la proprietà getter è stato sostituito nella classe derivata.

Una possibile soluzione è quella di memorizzare il valore di base in una variabile locale in modo da poter ispezionare questo.Che non sta per rendere il vostro getter più lento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top