É possível adicionar um acesso para uma propriedade em .NET, substituindo-o?
-
23-08-2019 - |
Pergunta
É possível fazer algo assim?
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B: A
{
private string X;
public override string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
Isto é, a classe base fornece uma propriedade virtual com apenas um acessor GET, mas a classe criança substitui o GET e também fornece um conjunto.
O exemplo atual não compilar, mas talvez eu estou faltando alguma coisa aqui.
Adicionado: Para esclarecer, não, eu não quero redefinir com o novo. Eu quero adicionar um novo assessor. Eu sei que não foi na classe base, de modo que não pode ser anulado. OK, deixe-me tentar explicar como ele ficaria sem o açúcar sintático:
class A
{
public virtual string get_prop()
{
return "A";
}
}
class B: A
{
private string X;
public override string get_prop()
{
return X;
}
public virtual string set_prop()
{
X = value;
}
}
Solução
Não, isso não é possível. Infelizmente você não pode mesmo substituir e alterar o nível de assessor (a partir de protegido e público , por exemplo), como documentado em MSDN . Eu recomendaria que você considere a reestruturação do código / aula um pouco e olhar para uma forma alternativa de realizar essa tarefa, como declarar o acessor conjunto com o protegido modificador usando um método SetProperty na classe derivada.
Outras dicas
Não, não há nenhuma maneira de fazer isso. Pense em como o açúcar sintático de sua propriedade virtual está a ser tratado, ou seja, ele é convertido em:
public virtual string get_prop();
Não há nenhum método set_Prop para substituir, e você não pode substituir um método que não existe.
Você pode ocultar a implementação da classe base usando a palavra-chave 'novo' em sua classe derivada. A seguir deve compilar com sucesso:
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B : A
{
private string X;
public new string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
A introdução de um novo campo cheira a confuso. E de qualquer forma, você precisa ter cuidado para não quebrar polimorfismo e herança (o que se as negociações da classe base para o campo privado?).
No que diz respeito à adição de um novo assessor, enquanto substituindo; a resposta simples é "não, você não pode". Quando você substitui, você só pode impactar os acessores existentes, uma vez que é o que está definido na tabela virtual para o membro (membro substituído ainda está "possuído" pela base / declarando classe, não a classe substituindo).
Uma opção (não ideal) é a re-declarar a propriedade, mas você ainda precisa de uma maneira de falar até a base de classe. Então, se o acessor na base de classe foi protected
:
class A
{
public string prop
{
get;
protected set;
}
}
class B : A
{
public new string prop
{
get { return base.prop; }
set { base.prop = value; }
}
}