2010-03-16 5 views
7

habe ich eine Basisklasse "Parent" wie folgt aus:Berufung "Base-Getter" in Zwingende Getter von Immobilien

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 ein Kind Klasse wie folgt:

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 ruft der Getter von Parent (oder zumindest das ist, was ich vorhabe).

Ich benutze jetzt die "Child" -Klasse, indem Sie es instanziieren, einen Wert (sagen wir 4) seiner VirtualProperty zuweisen und dann die Eigenschaft erneut lesen.

Wenn ich dies ausführen, bekomme ich offensichtlich eine ApplicationException sagen "Dummy Ex". Aber wenn ich einen Haltepunkt auf der Linie

if(base.VirtualProperty > 0) 

in Kinder- und überprüfen Sie den Wert base.VirtualProperty (indem Sie den Mauszeiger mit der Maus darüber) gesetzt, bevor die Ausnahme geworfen werden kann (Ich gehe davon aus (d)), Ich bekomme schon die Ausnahme. Daraus erteile ich, dass die Anweisung base.VirtualProperty im "Child-Getter sich selbst nennt"; So'ne Art.

Was Ich mag würde erreichen, ist das gleiche Verhalten, das ich bekomme, wenn ich die Definition von parentVirutalInt (in Parent) zu schützen und base.parentVirtualInt im Getter des Kindes statt base.VirtualProperty verwenden ändern. Und ich verstehe noch nicht, warum das nicht funktioniert. Kann irgendjemand etwas dazu sagen? Ich habe das Gefühl, dass sich überschriebene Eigenschaften anders verhalten als überschriebene Methoden?

Übrigens: Ich mache etwas sehr ähnliches mit Unterklasse eine Klasse, die ich keine Kontrolle habe (das ist der Hauptgrund, warum mein "Workaround" keine Option ist).

Mit freundlichen Grüßen

Antwort

8

Es ist (wohl) ein Fehler im Debugger. Sie können Ihre Stimme zu diesem feedback article hinzufügen. Das ist nicht einfach zu beheben, ich bin mir sicher, dass der Debugger keinen direkten Zugriff auf die Adresse der Basiseigenschafts-Getter-Methode hat, da der V-Tabellen-Slot für den Eigenschaften-Getter in der abgeleiteten Klasse ersetzt wurde.

Eine mögliche Abhilfe besteht darin, den Basiswert zuerst in einer lokalen Variablen zu speichern, damit Sie diesen prüfen können. Das wird deinen Getter nicht langsamer machen.