¿Es un constructor público en una clase abstracta un código? Hacer que el constructor esté protegido proporciona todo el acceso del que puede hacer uso. El único acceso adicional que se haría público sería permitir que las instancias de la clase se declaren como variables en ámbitos que no pueden acceder a sus miembros protegidos, pero las instancias de clases abstractas no se pueden declarar en absoluto.¿Es un constructor público en una clase abstracta un código?
Respuesta
Mi opinión sería que el constructor público podría ser confuso y, como dices, hacerlo protegido sería correcto. Diría que un constructor protegido refuerza correctamente la impresión de que el único uso sensato de una clase abstracta es derivar de él.
De hecho, solo necesita declarar un constructor en una clase abstracta si necesita hacer algo, ej. inicializar sus propios miembros privados. Entonces esperaría que haya otras funciones de miembros protegidas que sean útiles para las clases derivadas.
EDIT:
puesto que no se ha publicado ningún código y @sbi pedido un poco en un comentario a OP, pensé que iba a publicar algunos:
class Base:
{
public: // The question is: should the ctor be public or protected?
// protected:
Base():i(0){} // ctor is necessary to initialise private member variable
public:
virtual ~Base(){} // dtor is virtual (but thats another story)
// pure virtual method renders the whole class abstract
virtual void setValue(void)=0;
protected:
int getValue(void){ return i;}
private:
int i;
};
Base b1; // Illegal since Base is abstract, even if ctor is public
Base& b2=makeBase(); //We can point to, or refer to a Base
b2.setValue(); // We're not sure what this does, but we can call it.
b2.getValue(); // Illegal since getValue is protected
Como dices, no es necesario proporcionar el constructor público de la clase abstracta, ni se puede usar incorrectamente, si proporcionas el constructor público.
Sin embargo, puede considerar declarar el constructor como público como recomendación para estructurar clases derivadas del resumen.
¿Puedes explicar tu segunda oración? No entiendo cuál podría ser la recomendación. – quamrana
Creo que los directores públicos recomendarán la implementación de clases como un medio para diseñar la interfaz pública. Al igual, una clase abstracta de "Ventana" podría tener un editor público que tenga un parámetro "Ventana * principal". Se recomendará derivar clases para proporcionarlo también como un constructor público, que será parte de la interfaz. –
Pensé que podría ser el caso, diría que está mal. Yo diría que en el caso de un ctor, debería estar protegido y tomar los parámetros que necesita, independientemente de lo que deberían hacer las clases derivadas. Sin embargo, cualquier otra función de miembros virtual puros públicos ** debe ser una indicación fuerte de que una clase hoja debe implementar estos con (obviamente) el mismo nivel de acceso y parámetros. – quamrana
He leído en al menos una guía de codificación que los constructores de clases abstractas no deberían ser públicas. Creo que esa regla tiene sentido por el motivo que usted dio.
Sin embargo, no me puedo imaginar un escenario donde hacerlo público haría que las cosas salieran mal. Así que no iría tan lejos como para decir que es un olor a código. Veo el constructor protegido como una propiedad "agradable de tener" :)
De acuerdo, el constructor protegido explicita el hecho de que la clase no se puede instanciar directamente, por lo que es una "buena propiedad" desde el punto de vista del programador, incluso si el compilador realmente no se preocupa por ella. –
Las pautas de codificación se supone que lo protegen de las cosas malas que podrían suceder. Como no puedes crear una clase abstracta, no veo de qué te está protegiendo esta guía y, por lo tanto, me siento arbítaria. –
Dicen que al hacerlo protegido, usted hace explícito que no puede ser utilizado por las clases derivadas. Sospecho que es una lógica similar a la del operador miembro new y delete: son miembros implícitamente estáticos, pero es bueno hacerlos explícitamente estáticos. Por otro lado, la definición en clase de las funciones de los miembros está implícitamente en línea, y yo diría que es deficiente hacerlas explícitamente en línea. Al final, creo que este tema de constructor protegido es más una cuestión de gusto. –
tener cuidado sin embargo a explícitamente declarar/definir su constructor de copia privada/protegida. Si no lo hace, el compilador lo hará por usted. Ver scott meyers effective c++ elemento 6.
Yo diría que es una mala señal por un par de razones.
La primera es que podría confundir a alguien haciéndole creer que puede llamar a esa rutina.
La segunda es que implica que el autor pensó que podía llamarlo. Ahora no sabe si esa fue una parte importante de su diseño o no.
No creo que esos sean argumentos válidos. Nadie que sepa lo primero sobre el diseño de OO o C++ pensaría que podrías llamarlo y, en segundo lugar, el compilador emitirá un error en el momento en que lo intentes. –
Sé que una gran cantidad de personas obviamente no está de acuerdo, pero no creo que un editor de clases abstractas deba estar protegido a menos que la interfaz que está diseñando tenga un motivo específico para que todas las clases derivadas también tengan un ctor protegido.
La razón es que cuando diseñas una clase abstracta estás diseñando una interfaz para ser implementada por las clases derivadas. Las clases derivadas deberían implementar la interfaz exactamente como está diseñada en la clase base. La interfaz presentada por una clase base abstracta es un contrato; no rompas ese contrato.
O en otras palabras, si está cambiando la interfaz, ¿por qué se deriva de esa clase en primer lugar?
Esto es un poco de una respuesta religiosa, pero qué diablos. ;-)
@Robert: Entiendo su razón dada aquí, pero creo que no se aplica a la ctor. Sí, otras funciones de miembro público y protegido (excluyendo el ctor y dtor) proporcionan interfaces que son un contrato y usted debe pensar dos veces antes de cambiarlas. – quamrana
La clase abstracta nunca se puede instanciar directamente debido a los métodos virtuales puros que declara. Entonces, declarar al constructor como protegido solo agrega consejos adicionales para los programadores.
Vi la recomendación de declarar el constructor como protegido here, en la guía de estilo de Google. Y he encontrado recomendaciones similares en algunos otros estándares de codificación corporativa. Así que esto parece una buena práctica.
- 1. Relevancia del constructor 'público' en la clase abstracta
- 2. ¿Hay buenas razones para un constructor público de una clase abstracta
- 3. ¿Es bueno tener un constructor en clase abstracta?
- 4. Constructor privado en la clase abstracta
- 5. constructor público y constructor estático
- 6. que imita una llamada en un método público de una clase abstracta y sin la subclasificación de la clase abstracta, utilizando Mockito prefererably
- 7. Usando un método de una clase abstracta
- 8. constructor de copia: copia completa una clase abstracta
- 9. ¿cómo público es un repositorio público github?
- 10. ¿De qué sirve crear un constructor para una clase abstracta en Java?
- 11. En caso de que una clase abstracta tenga un serialVersionUID
- 12. Cómo crear una instancia de una clase abstracta de Java con un parámetro de constructor con un cierre maravilloso
- 13. ¿Cómo implementar parcialmente un contrato en una clase base abstracta?
- 14. ¿Para qué JAXB necesita un constructor público no-arg?
- 15. Debe copiar el constructor sea privado o público
- 16. Uso de make_shared con un constructor protegido + interfaz abstracta
- 17. serialización de una clase abstracta
- 18. implementando un operador de conversión en una clase abstracta genérica
- 19. ¿Qué es un módulo de objeto público en VBA?
- 20. ¿Cómo puedo implementar una clase singleton abstracta en Java?
- 21. ¿Cuál es una práctica común de completar la clase abstracta?
- 22. Patrón de diseño del constructor: sin clase/interfaz abstracta
- 23. php clase abstracta extendiendo otra clase abstracta
- 24. Java: ¿la clase Object tiene un constructor?
- 25. ¿Es aceptable tener un parámetro en el constructor de clase?
- 26. ¿Cómo puedo forzar que un Constructor se defina en todas las subclases de mi clase abstracta?
- 27. ¿Qué es la clase abstracta en php?
- 28. Haciendo un código beta para un sitio público de django
- 29. Mocking clase abstracta que tiene dependencias de constructor (con Moq)
- 30. Método vacío en una clase abstracta
¿Cómo se pueden declarar las variables de una clase abstracta? ¿Me estoy perdiendo de algo? – sbi
Creo que OP significa métodos, como en 'métodos de miembros protegidos '. – quamrana
Todavía no lo entiendo. ¿Podrías mostrar un ejemplo? – sbi