Hoy noté que básicamente nunca uso protected
métodos en código C ++, porque rara vez siento la necesidad de llamar a métodos no públicos de un padre. Utilizo protegido en Java en el patrón de método de plantilla, pero como puede anular métodos privados en C ++, tampoco lo necesito protected
.
Entonces, ¿cuáles son algunos escenarios del mundo real en los que me gustaría usar protected
métodos en código C ++?
(Tenga en cuenta que no soy muy aficionado a la herencia de implementación en general, eso podría explicar mucho ...)
fuente
Un ejemplo que uso con frecuencia es que en la Clase base de mi Jerarquía de objetos tendré un Logger protegido. Todas mis clases básicas necesitarán acceso al registrador, pero no hay ninguna razón para que sea públicamente accesible.
Además, si está utilizando el patrón de Plantilla y tiene un método de ejecución previa o posterior en la clase base, puede llamar a la implementación base desde el método de anulación. Si la base solo es privada (y aún se puede sobrescribir en C ++), no podrá llamar a la implementación base desde el método de anulación.
fuente
Solo un ejemplo que he usado en el pasado. Los métodos protegidos son excelentes para proporcionar funciones específicas de implementación, al tiempo que permiten que la clase base realice un seguimiento adecuado de las cosas. Considere una clase base que proporciona una función de inicialización reemplazable, pero también debe tener un estado para determinar si se inicializa:
Todo está bien y bien aquí. Excepto cuando una clase derivada no se molesta en llamar, sobre
setInitialized()
todo el hecho de que cualquiera puede llamarla (¡podríamos proteger esto aquí, y otra razón para usar métodos protegidos!). Prefiero una clase que haga uso de miembros virtuales protegidos:En nuestra nueva clase, toda la inicialización todavía se delega a la clase derivada. Siempre que se haya lanzado una excepción, mantenemos el contrato "esta clase se inicializa" que nuestro método dice que sucederá.
fuente
Como muchas otras características, le
protected
permite romper la encapsulación en cierta medida. Romper los conceptos de OO puro generalmente se hace por varias razonesinline
),friend
permite restringir el acceso a los miembros de la clase a unos pocos amigos)y
protected
es solo una de las herramientas en esa caja. Puede usarlo si desea dar acceso a clases derivadas a algunas partes de una clase que deberían estar ocultas para el público en general.Un caso en el que lo he usado es hacer que todos los constructores de una clase
protected
, básicamente, hagan que esa clase sea abstracta (no se puede crear una instancia, excepto como un subobjeto de un objeto de una clase derivada).fuente
Quizás fue un mal diseño, pero lo tuve para algo como esto:
Las clases derivadas, en
update()
, podrían activar la señal llamandotrigger_signal()
. Pero como eso es todo lo que deberían poder hacer con la señal, la señal en sí se dejó en privado. La función de activación se protegió porque solo la clase derivada debería poder activarla, nada en absoluto.fuente
"Métodos públicos": una clase puede hacer esto. "Métodos protegidos": cómo una clase puede hacer esto. "Métodos privados": cómo una clase puede hacer esto, pero "soy paranoico y no quiero que nadie sepa cómo lo hago".
Entonces, un nuevo cocinero (desarrollador) llega a su restaurante de comida rápida. Lo enseñas, vendes hamburguesas (métodos públicos), cómo preparar las hamburguesas (métodos protegidos), pero guarda la salsa de receta secreta "patentada" para ti.
fuente