2010-03-16 10 views
7

Mam klasy bazowej "rodzic" tak:powołanie "Base-Getter" w nadrzędnym Getter Własności

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

i klasę dziecka tak:

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

pamiętać, że getter w Child nazywa callera Parent (a przynajmniej to właśnie zamierzam).

Teraz używam klasy "Dziecko", tworząc ją, przypisując jej wartość (powiedzmy 4) do jej właściwości wirtualnej, a następnie ponownie odczytując właściwość.

Po uruchomieniu tego oczywiście otrzymuję wyjątek ApplicationException z napisem "Dummy Ex". Ale jeśli ustawić punkt przerwania na linii

if(base.VirtualProperty > 0) 

u dziecka i sprawdzić wartość base.VirtualProperty (najeżdżając myszą nad nim) przed Wyjątkiem może być rzucony (zakładam, (d)), Dostałem już wyjątek. Z tego wynika, że ​​oświadczenie base.VirtualProperty w "Child-Getter nazywa się"; rodzaj.

To, co chciałbym osiągnąć, to to samo zachowanie, które otrzymuję, gdy zmieniam definicję parentVirutalInt (w Parent), aby chronić i używać base.parentVirtualInt w Getter of Child zamiast base.VirtualProperty. I jeszcze nie rozumiem, dlaczego to nie działa. Czy ktoś może rzucić trochę światła na to? Uważam, że przesłonięte właściwości zachowują się inaczej niż przesłonięte metody?

Przy okazji: Robię coś bardzo podobnego z podklasowaniem klasy, na którą nie mam żadnej kontroli (jest to główny powód, dla którego moje "obejście" nie jest opcją).

poważaniem

Odpowiedz

8

Jest to (arguably) błąd w debugger. Możesz dodać swój głos do tego feedback article. Nie jest to łatwe do naprawienia, jestem pewien, że debugger nie ma gotowego dostępu do adresu metody getter właściwości base, ponieważ slot v-table dla gettera właściwości został zastąpiony w klasie pochodnej.

Jednym z możliwych obejść jest najpierw przechowywanie wartości bazowej w zmiennej lokalnej, aby można było to sprawdzić. To nie sprawi, że twój getter będzie wolniejszy.