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;
    }
}
Foi útil?

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; }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top