Chamando de "Base-Getter" em Substituir Getter of Property
-
20-09-2019 - |
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
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.