Вызов «базовый получатель» в переосмыслении имущества

StackOverflow https://stackoverflow.com/questions/2455667

Вопрос

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

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

Обратите внимание, что Getter in Child называет Getter of Parent (или, по крайней мере, это то, что я намерен).

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

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

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

if(base.VirtualProperty > 0)

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

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

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

С уважением

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top