Вызов “Основного Метода считывания” в переопределении метода считывания свойства

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

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, говоря "Макет Исключая". Но если я установил точку останова на строке

if(base.VirtualProperty > 0)

в Ребенке и проверяют значение base.VirtualProperty (путем парения мыши над ним), прежде чем исключение может быть выдано (я принимаю (d)), я уже получаю Исключение. От этого я передаю этому оператор base.VirtualProperty в "Дочернем методе считывания называет себя"; отчасти.

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

Между прочим: Я делаю что-то очень похожее на разделение на подклассы класса, я не имею никакого контроля над (это - главная причина, почему мое "обходное решение" не является опцией).

С уважением

8
задан scherand 16 March 2010 в 15:27
поделиться

1 ответ

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

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

8
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: