Re: Herencias en C++: 2/3
Hola Dani,
muy lindo, me gusto. Solo para asegurarme que no me estoy perdiendo ningun detalle (o que no me estoy perdiendo
), el metodo entonces devuelve bool y no int verdad?
Sigo con3) usos + avanzados: template design pattern & mixins, private inheritance, curiously recursive template pattern=================================================================Ya hubo un adelanto de 'private inheritance' (ejemplos de Soledad, politicos corruptos y demas).
Sigo con tres usos un cacho mas complejos de herencia en C++: template design pattern & mixins, CRTP, y un caso practico de este ultimo: aspect oriented programming.a) Template Design Pattern.Este pattern intenta resolver lo siguiente: cuando existen varios 'sabores' de un algoritmo, pero todos tienen en comun la misma secuencia de pasos. Lo que varia, es la implementacion de uno o mas de esos pasos.Por ejemplo: odenar tanto de > como de <, el algoritmo no cambia, lo que cambia es la implementacion de la comparacion.Voy a mostrar esto como se hace de las dos maneras: usando polimorfismo por inclusion, y polimorfismo parametrico, con mi sorting favorito (el selection).El pseudocodigo como todo mundo conoce:for i = 1 .. n-1j = mejor_del_rango(i, n);if (i != j)swap v[i], v[j]y mejor_del_rango selecciona, de acuerdo a algun criterio el mejor o el mayor del rango pedido. Esto va a denotar el 'sabor'.Entonces, la idea del Template Design Pattern, es ubicar los pasos a la clase base, y dejar que una derivada implemente el 'sabor'.Ej:class SelectionSort{public: void sort(vector<int>& v);private:virtual int comparar(int x, int y) const = 0;};class MenorAMayor: public SelectionSort{private: virtual int comparar(int x, int y) const { return x < y; }};Esto es: la clase base hace de master, y la derivada de slave. Osea, la base tiene la manijita, y le pregunta a la derivada "que onda x e y?".Asi las cosas, un usuario instancia un MenorAMayor por ejemplo, e invoca el metodo publico de la clase base: sort.Pasando a la version parametrica:template <class Comparador>class SelectionSort{void sort(vector<int>& vec, Comparador& c){.... c.comparar(vec[i], vec[j]);}};Como se ve en este ultimo ejemplo, el polimorfismo esta dado en que, cualquier Comparador que se jacte de serlo, tiene que proveer un metodo comparar que reciba dos enteros, y devolver un bool. La clase SelectionSort sigue teniendo la manijita, y usa al Comparador para preguntarle qué onda.Esto ultimo tambien se conoce como 'policy class' o 'traits' (en este caso, la clase Comparador es la policy class, o politica de comparacion).Es muy importante en esto tener en claro los roles: quien hace de master y quien de slave.Como me quedó el mail muy largo, dejo los otros temas para un "Herencias en C++: 2.1/3".Solo comparo brevemente las dos versiones: polimorfismo por inclusion o parametrico.Ventajas de la version x inclusion:* ejecutable mas chico* mas legible* errores de compilacion mas claros.* codigo mas ordenado (no requiere inlines, por lo que todo puede estar organizado en .cpp y .h)Ventajas de la version parametrica:* mas performante en general. Habilita inlining.PERO OJO: lo importante es que NO se mezclen los tipos de polimorfismo. Regla general: si usas 'virtual' y 'template' en la misma clase, tiene Oracle (oloráculo).Daniel.
--
Gabriel Viganotti
Cel: +44 7795491396
"Monday's problems are the result of Friday's fatigue"
--~--~---------~--~----~------------~-------~--~----~
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
-~----------~----~----~----~------~----~------~--~---
RSS Feed