Considere un calendario de clase que almacena un grupo de objetos Date. El calendario está diseñado para contener una colección de cualquier tipo de objetos que hereden de Fecha. Pensé que la mejor manera de hacerlo es tener una plantilla de clase comoC++: plantilla de clase polimórfica
template<typename D> class Calendar{
...
}
Pero se me ocurrió que ahora D puede ser de hecho cualquier clase. Mi pregunta es ahora, ¿cómo puedo asegurarme de que D es una subclase del objeto de fecha?
Sé cómo hacer esto es Java, pero todavía no estoy familiarizado con la sintaxis de C++. El problema es muy similar a cómo algunas colecciones solo pueden tomar una plantilla de variables que implementen Comparable. El encabezado se vería más o menos como
public class Calendar<D extends Date>{
...
}
-------------------- EDIT: -------------- ----------------------------
El argumento de la plantilla define a qué día real se refiere el calendario. Los diferentes tipos de fecha se refieren al mismo día en diferentes formatos. Por ejemplo, si hago un Calendar<Gregorian>
podrá tomar fechas en otro formato Date
, decir el calendario juliano, o cualquier otro formato de fecha y presentarlos en formato gregoriano. Esto permite la conversión entre calendarios en diferentes formatos de fecha. Entonces, si tengo un Calendar<Gregorian>
puedo convertirlo fácilmente en un Calendar<Julian>
. A continuación, la siguiente es posible:
Calendar<Gregorian> cal;
std::cout << "These events are entered as dates in
the Gregorian calendar" << std::endl;
cal.add_event("Christmas", 12, 25);
cal.add_event("Gregorian new year", 1, 1);
std::cout << cal << std::endl;
std::cout << "----" << std::endl;
std::cout << "And printed out as Julian dates" << std::endl;
Calendar<Julian>(cal);
std::cout << cal<< std::endl;
y salidas:
These events are entered as dates in the Gregorian calendar
2009-12-25 Christmas
2010-01-01 Gregorian new year
----
And printed out as Julian dates
2009-12-13 Christmas
2009-12-19 Gregorian new year
------------- Nueva edición: ----------- -----------
La última edición ahora tiene más sentido. Tenía un ligero desacuerdo con el formato.
Gracias por todas las respuestas.
Soy un estudiante de Informática en mi tercer año, y diría que estoy bastante familiarizado con OO y conceptos relacionados como Polimorfismo, etc. El propósito de este post fue averiguar si había o no un manera en C++ para expresar una condición para un argumento de plantilla de la misma manera que está en Java y resolver el problema de una manera concisa, elegante e intuitiva.
¿Por qué * necesita * ser una subclase de Fecha? Siempre que se comporte como una Fecha (expone los miembros correctos), ¿qué hay de malo en tratarla como una Fecha? – jalf