Вызов "Base-Getter" в главном гетто собственности - PullRequest
8 голосов
/ 16 марта 2010

У меня есть базовый класс "Родитель", как это:

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

Обратите внимание, что метод get в Child вызывает метод get of Parent (или, по крайней мере, это то, что я намереваюсь).

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

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

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

if(base.VirtualProperty > 0)

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

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

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

С уважением

1 Ответ

8 голосов
/ 16 марта 2010

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

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

...