2010-03-16 3 views
7

ho una classe di base "Parent" come questo:Calling "Base-Getter" in Overriding Getter della Proprietà

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 figlia come 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 in Child sta chiamando il getter di Parent (o almeno questo è ciò che intendo).

Ora utilizzo la classe "Bambino" istanziandola, assegnando un valore (diciamo 4) alla sua Proprietà Virtuale e quindi leggendo nuovamente la proprietà.

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

Quando eseguo questo, ovviamente ottengo un ApplicationException che dice "Dummy Ex". Ma se ho impostato un punto di interruzione sulla linea

if(base.VirtualProperty > 0) 

nel bambino e verificare il valore di base.VirtualProperty (passando il mouse su di esso) prima che l'eccezione può essere lanciata (presumo (d)), Ho già ricevuto l'eccezione. Da ciò trasmetto che l'affermazione base.VirtualProperty nel "Child-Getter chiama se stessa"; tipo.

Quello che vorrei ottenere è lo stesso comportamento che provo quando cambio la definizione di parentVirutalInt (in Parent) per proteggere e utilizzare base.parentVirtualInt nel Getter del bambino, invece di base.VirtualProperty. E non vedo ancora perché questo non funzioni. Qualcuno può fare luce su questo? Sento che le proprietà sottoposte a override si comportano in modo diverso rispetto ai metodi sottoposti a override?

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

Cordiali saluti

risposta

8

E '(forse) un bug nel debugger. Puoi aggiungere il tuo voto a questo feedback article. Questo non è facile da risolvere, ne sono sicuro, il debugger non ha accesso immediato all'indirizzo del metodo getter della proprietà di base poiché lo slot v-table per il getter della proprietà è stato sostituito nella classe derivata.

Una possibile soluzione è quella di memorizzare il valore di base in una variabile locale prima di poterlo controllare. Questo non renderà il tuo getter più lento.