Pergunta

Eu tenho uma classe base "pai" assim:

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

E uma aula infantil como esta:

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

Observe que o getter na criança está chamando o getter do pai (ou pelo menos é isso que eu pretendo).

Agora eu uso a classe "criança" instantando -a, atribuindo um valor (digamos 4) à sua propriedade virtual e depois lendo a propriedade novamente.

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

Quando eu corro isso, obviamente recebo uma ApplicationException dizendo "Dummy Ex". Mas Se eu definir um ponto de interrupção na linha

if(base.VirtualProperty > 0)

na criança e verifique o valor de base.VirtualProperty (passando o mouse sobre ele) antes que a exceção possa ser jogada (Presumo (d)), eu já recebo a exceção. A partir disso, transmito que a afirmação base.VirtualProperty no "Child-sTetter se chama"; tipo de.

O que eu gostaria de alcançar é o mesmo comportamento que recebo quando mudei a definição de parentVirutalInt (entre os pais) para proteger e usar base.parentVirtualInt no getter da criança em vez de base.VirtualProperty. E ainda não vejo por que isso não está funcionando. Alguem pode iluminar isso? Sinto que as propriedades substituídas se comportam de maneira diferente dos métodos substituídos?

A propósito: estou fazendo algo muito parecido com a subclassificação de uma classe que não tenho nenhum controle (essa é a principal razão pela qual minha "solução alternativa" não é uma opção).

Atenciosamente

Foi útil?

Solução

É (sem dúvida) um bug no depurador. Você pode adicionar seu voto a isso Artigo de feedback. Isso não é fácil de corrigir, tenho certeza, o depurador não tem acesso pronto para o endereço do método da propriedade básica, já que o slot da tabela V para a propriedade Getter foi substituído na classe derivada.

Uma possível solução alternativa é armazenar o valor base em uma variável local primeiro para que você possa inspecionar isso. Isso não vai tornar seu getter mais lento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top