2010-03-16 17 views
7

que tienen una clase base "padre" de esta manera:llamada "Base-Getter" en Anulación Getter de la Propiedad

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; 
       } 
      } 
     } 
    } 
} 

y una clase de niño como éste:

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; 
       } 
      } 
     } 
    } 
} 

Tenga en cuenta que el captador en Child está llamando a getter of Parent (o al menos esto es lo que intento).

Ahora uso la clase "Niño" instanciandola, asignando un valor (digamos 4) a su Propiedad Virtual y luego leyendo la propiedad nuevamente.

Child c = new Child(); 
c.VirtualProperty = 4; 
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty); 

Cuando ejecuto esto, obviamente obtengo una ApplicationException que dice "Dummy Ex". Pero si me puse un punto de interrupción en la línea

if(base.VirtualProperty > 0) 

en Infantil y comprobar el valor de base.VirtualProperty (colocando el cursor del ratón sobre él) antes de que la excepción se puede (supongo (d)), Ya recibo la excepción. De esto expreso que el enunciado base.VirtualProperty en "Child-Getter se llama a sí mismo"; mas o menos.

Lo que me gustaría lograr es el mismo comportamiento que consigo cuando cambie la definición de parentVirutalInt (en los Padres) para proteger y utilizar base.parentVirtualInt en el Getter del niño en lugar de base.VirtualProperty. Y todavía no veo por qué esto no está funcionando. ¿Alguien puede arrojar algo de luz sobre esto? Siento que las propiedades anuladas se comportan de manera diferente que los métodos anulados?

Por cierto: estoy haciendo algo muy similar con la subclasificación de una clase sobre la que no tengo ningún control (esta es la razón principal por la que mi "solución alternativa" no es una opción).

Saludos cordiales

Respuesta

8

que es (posiblemente) un error en el depurador. Puede agregar su voto a este feedback article. Esto no es fácil de arreglar, estoy seguro, el depurador no tiene acceso rápido a la dirección del método getter de la propiedad base ya que la ranura de la tabla v para el getter de la propiedad ha sido reemplazada en la clase derivada.

Una solución posible es almacenar primero el valor base en una variable local para que pueda inspeccionar esa. Eso no hará que tu getter sea más lento.

Cuestiones relacionadas