Pregunta

Tengo una clase base "padre" de esta manera:

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 el captador del padre (o al menos esto es lo que pienso).

ahora uso la clase "Niño" instanciándola, la asignación de un valor (digamos 4) a su VirtualProperty y después de leer la propiedad de nuevo.

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

Cuando ejecuto esto, obviamente, sale un ApplicationException diciendo "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)), que ya recibe la excepción. A partir de este transmito que el base.VirtualProperty declaración en el "niño-Getter llama a sí mismo"; tipo de.

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 sin embargo, no veo por qué esto no está funcionando. ¿Alguien puede arrojar algo de luz sobre esto? Siento que las propiedades sobrescritos se comportan de manera diferente a métodos sobrescritos?

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

Saludos

¿Fue útil?

Solución

Es (posiblemente) un error en el depurador. Usted puede añadir su voto a esta artículo comentarios . Esto no es fácil de solucionar, estoy seguro, el depurador no tiene acceso inmediato a la dirección de método getter propiedad de la base desde la ranura de tabla v para la propiedad de captador ha sido sustituido en la clase derivada.

Una posible solución es almacenar el valor base en una variable local en primer lugar para que pueda inspeccionar que uno. Eso no va a hacer que su captador más despacio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top