Aufrufen "Basis-Getter" in übergeordnetem Eigentum von Eigentum
-
20-09-2019 - |
Frage
Ich habe eine Basisklasse "Eltern" wie folgt:
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;
}
}
}
}
}
Und eine Kinderklasse wie diese:
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;
}
}
}
}
}
Beachten Sie, dass der Getter in Child den Getter des Elternteils anruft (oder zumindest das ist, was ich beabsichtige).
Ich benutze jetzt die "Child" -Klasse, indem ich sie instanziiere, deren Wert (sagen wir 4) seiner virtuellen Anpassung und dann die Eigenschaft erneut.
Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);
Wenn ich das ausführe, bekomme ich offensichtlich eine Anwendung, die "Dummy Ex" sagt. Aber Wenn ich einen Haltepunkt in der Linie festlegt
if(base.VirtualProperty > 0)
im Kind und überprüfe den Wert von base.VirtualProperty
(durch Überschwebe der Maus darüber) bevor die Ausnahme geworfen werden kann (Ich nehme an (d)), ich bekomme bereits die Ausnahme. Daraus vermitteln ich das die Aussage base.VirtualProperty
in der "Kind-Getter nennt sich"; So'ne Art.
Was ich erreichen möchte, ist das gleiche Verhalten, das ich bekomme, wenn ich die Definition von ändere parentVirutalInt
(im Elternteil) zu schützen und zu verwenden base.parentVirtualInt
im Getter des Kindes statt des base.VirtualProperty
. Und ich verstehe noch nicht, warum das nicht funktioniert. Kann jemand etwas Licht darauf werfen? Ich habe das Gefühl, dass sich überschriebene Eigenschaften anders verhalten als überschriebene Methoden?
Übrigens: Ich mache etwas sehr Ähnliches mit der Unterklasse einer Klasse, über die ich keine Kontrolle habe (dies ist der Hauptgrund, warum meine "Problemumgehung" keine Option ist).
Mit freundlichen Grüßen
Lösung
Es ist (wohl) ein Fehler im Debugger. Sie können Ihre Stimme dazu hinzufügen Feedback -Artikel. Ich bin mir sicher, dass der Debugger nicht einfach zu beheben ist, da der Debugger keinen Vorgang auf die Adresse der Basis-Eigenschaft Getter-Methode hat, da der V-Table-Steckplatz für den Immobiliengesetz in der abgeleiteten Klasse ersetzt wurde.
Eine mögliche Problemumgehung besteht darin, den Basiswert zuerst in einer lokalen Variablen zu speichern, damit Sie diese untersuchen können. Das wird Ihren Getter nicht langsamer machen.