Pregunta

Hola, tengo una clase " A " con como método abstracto

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

Quiero anular este método en la clase derivada "B" con las siguientes condiciones

  • Debería ser privado para la clase B.
El compilador

no me permite declarar este método como privado en la clase derivada "B" ¿Cuál es la sintaxis correcta?

¿Fue útil?

Solución

No puedes. Eso violaría el nivel de accesibilidad declarado en la clase A. ¡Aparte de cualquier otra cosa, evitaría que la clase A lo invocara! ¿Qué esperaría que suceda si el código de la clase A intenta llamar al método abstracto que de alguna manera anularía con una implementación privada?

Puede hacer que la implementación principal sea privada y luego crear un método protegido que simplemente llame al privado, si realmente lo desea.

¿Por qué quieres hacer que el método sea privado en primer lugar, cuando está diseñado para que se pueda llamar desde A?

EDITAR: Bien, ahora que has explicado en tu comentario lo que quieres hacer, no puedes hacerlo. Lo más cercano que puede llegar es pasar un delegado al constructor de A, ese delegado puede referirse a un método privado. Desafortunadamente, no puede usar " this " cuando pasa argumentos en cadenas de constructor, por lo que se ve obligado a hacer algo horrible, como escribir un método estático que toma " esto " como primer parámetro, efectivamente ... excepto que también tendrá que convertirlo al tipo correcto, ya que el padre no puede declarar qué tipo debería ser. El padre entonces llamaría al delegado en lugar del método protegido.

Tenga en cuenta que esto también evitaría que otras clases derivadas anulen " Además, lo que puede o no ser deseable.

Es increíblemente tortuoso, y trataría de evitarlo siempre que sea posible. Si realmente le preocupa lo que podrían hacer las clases derivadas, trataría de sellar la clase en su lugar y obligar a las personas a usar la composición en lugar de la herencia. El lenguaje realmente no te ayuda a hacer lo que quieres aquí.

Otros consejos

Como regla general de OOPS, no se puede reducir la visibilidad de un miembro cuando se anula. Por lo tanto, pasar de protegido a privado no está permitido.

No puede cambiar el nivel de acceso de los métodos virtuales en C #. Puede volver a declararlo utilizando la palabra clave new , pero esta es una redeclaración que oculta el método anterior, por lo que no funcionará como espera si se trata de objetos que difieren en el tipo declarado y real. , o si habitualmente convierte objetos a un tipo de clase base.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top