Pergunta

Oi eu tenho uma classe "A" com como método abstrato

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

Eu quero substituir esse método na classe derivada "B" com as seguintes condições

  • Deve ser privada para classe B.

compilador não permitam-me para declarar este método como privado no derivado classe "B" o que é a sintaxe correta?

Foi útil?

Solução

Você não pode. Isso violaria o nível de acessibilidade declarado na classe A. Além de qualquer outra coisa, ele iria impedi-lo de ser exigível por classe A! O que você espera que aconteça se o código em tentativas classe A para chamar o método abstrato que você de alguma forma substituído com uma implementação privada?

Você pode fazer a implementação principal privada e, em seguida, criar um método protegido que apenas chama o privado, se você realmente quer.

Por que você quer para tornar o método privado em primeiro lugar, quando é projetado para ser exigível a partir de A?

EDIT: Ok, agora que você explicou em seu comentário que você quer fazer, você não pode fazê-lo. O mais próximo que você pode chegar é passar um delegado para o construtor de A - esse delegado pode se referir a um método particular. Infelizmente, você não pode usar "this" quando você passar argumentos em cadeias construtor, então você é forçado a fazer algo horrível como escrever um estática método que leva "isto" como seu primeiro parâmetro, eficazmente ... exceto que ele vai ter que convertê-lo para o tipo certo bem, como o pai não pode declarar qual o tipo que deve ser. O pai, então, chamar o delegado em vez do método protegido.

Note que isso também iria evitar mais classes derivadas de "substituir" ainda mais, o que pode ou não ser desejável.

É incrivelmente tortuoso, e eu ia tentar evitá-lo sempre que possível. Se você está realmente preocupado com o que as classes derivadas pode fazer, eu ia tentar selar a classe em vez disso e forçar as pessoas a composição uso em vez de herança. A linguagem não é realmente ajudá-lo a fazer o que você quer aqui.

Outras dicas

Como regra geral OOPS, não se pode reduzir a visibilidade de um membro ao substituir. Então, indo de protegidos como privado não é permitido.

Você não pode alterar o nível de acesso de métodos virtuais em C #. Você pode redeclare-lo usando a palavra-chave new, mas este é um redeclaração que esconde o método anterior, por isso não vai funcionar como você espera se você está lidando com objetos que diferem em objetos declarados e tipo real, ou se você rotineiramente expressos para um tipo de classe base.

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