Вызов «базовый получатель» в переосмыслении имущества
-
20-09-2019 - |
Вопрос
У меня есть базовый класс «родитель», как это:
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 более медленным.