Mam klasy bazowej "rodzic" tak:powołanie "Base-Getter" w nadrzędnym Getter Własności
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;
}
}
}
}
}
i klasę dziecka tak:
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;
}
}
}
}
}
pamiętać, że getter w Child nazywa callera Parent (a przynajmniej to właśnie zamierzam).
Teraz używam klasy "Dziecko", tworząc ją, przypisując jej wartość (powiedzmy 4) do jej właściwości wirtualnej, a następnie ponownie odczytując właściwość.
Po uruchomieniu tego oczywiście otrzymuję wyjątek ApplicationException z napisem "Dummy Ex". Ale jeśli ustawić punkt przerwania na linii
if(base.VirtualProperty > 0)
u dziecka i sprawdzić wartość base.VirtualProperty
(najeżdżając myszą nad nim) przed Wyjątkiem może być rzucony (zakładam, (d)), Dostałem już wyjątek. Z tego wynika, że oświadczenie base.VirtualProperty
w "Child-Getter nazywa się"; rodzaj.
To, co chciałbym osiągnąć, to to samo zachowanie, które otrzymuję, gdy zmieniam definicję parentVirutalInt
(w Parent), aby chronić i używać base.parentVirtualInt
w Getter of Child zamiast base.VirtualProperty
. I jeszcze nie rozumiem, dlaczego to nie działa. Czy ktoś może rzucić trochę światła na to? Uważam, że przesłonięte właściwości zachowują się inaczej niż przesłonięte metody?
Przy okazji: Robię coś bardzo podobnego z podklasowaniem klasy, na którą nie mam żadnej kontroli (jest to główny powód, dla którego moje "obejście" nie jest opcją).
poważaniem