У меня есть базовый класс "Родитель" как это:
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
. И я еще не вижу, почему это не работает. Кто-либо может пролить некоторый свет на это? Я чувствую, что переопределенные свойства ведут себя по-другому, чем переопределенные методы?
Между прочим: Я делаю что-то очень похожее на разделение на подклассы класса, я не имею никакого контроля над (это - главная причина, почему мое "обходное решение" не является опцией).
С уважением
Это (возможно) ошибка в отладчике. Вы можете проголосовать за эту статью отзыва . Это непросто исправить, я уверен, что у отладчика нет готового доступа к адресу метода получения базового свойства, поскольку слот v-table для получателя свойств был заменен в производном классе.
Один из возможных обходных путей - сначала сохранить базовое значение в локальной переменной, чтобы вы могли его проверить. Это не сделает вашего геттера медленнее.