2010-03-16 4 views
7

У меня есть базовый класс "Родитель", как это:Calling "Base-Getter" в ПРЕИМУЩЕСТВЕННОМ Getter имущества

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

и класс ребенка, как это:

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

Обратите внимание, что добытчик в Ребенке зовет получателя Родитель (или, по крайней мере, это то, что я намерен).

Теперь я использую класс «Ребенок», создав его, присвоив значение (скажем, 4) его VirtualProperty, а затем снова прочитав свойство.

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

Когда я запускаю это, я, очевидно, получаю исключение ApplicationException «Dummy Ex». Но если я поставил точку останова на линии

if(base.VirtualProperty > 0) 

в ребенке и проверить значение base.VirtualProperty (при наведении курсора мыши на него) прежде, чем исключение может быть выброшено (я предполагаю, что (г)), Я уже получаю Исключение. Из этого я догадываюсь, что заявление base.VirtualProperty в «Child-Getter вызывает себя»; вид.

То, что я хотел бы достичь такого же поведение я получаю, когда я изменить определение parentVirutalInt (в Parent) для защиты и использование base.parentVirtualInt в добытчике ребенка вместо base.VirtualProperty. И я пока не понимаю, почему это не работает. Может ли кто-нибудь пролить свет на это? Я чувствую, что переопределенные свойства ведут себя иначе, чем переопределенные методы?

К слову: я делаю что-то очень похожее с подклассифицированием класса, в котором я не контролирую (это основная причина, почему мой «обходной путь» не является вариантом).

Сердечные приветы

ответ

8

Это (возможно) ошибка в отладчике. Вы можете добавить свой голос к этому feedback article. Это нелегко исправить, я уверен, что отладчик не имеет готового доступа к базовому методу метода getter, поскольку слот v-table для свойства getter был заменен в производном классе.

Один из возможных способов обхода - сначала сохранить базовое значение в локальной переменной, чтобы вы могли проверить его. Это не сделает ваш геттер медленнее.

Смежные вопросы