Tengo que tomar una decisión con respecto a la generalización frente al polimorfismo.C++ práctica estándar: clases de interfaz virtual frente a plantillas
Bueno, el escenario es estándar: quiero que mi código interdependiente monolítico sea más modular, limpio y extensible. Todavía está en una etapa donde el principio de cambio de diseño es factible, y, como lo veo, muy deseable.
¿Introduciré clases base (interfaces) o plantillas puramente virtuales?
Soy consciente de los conceptos básicos con respecto a la opción de plantilla: menos indirecto, un mejor rendimiento, más la compilación pero sin fines de unión, y así sucesivamente.
stl no usa mucho (¿o ninguna?) Herencia, y el impulso tampoco. Pero creo que están destinadas a ser herramientas básicas muy pequeñas que se utilizan cada 2 líneas de código por el programador.
considero la herencia y el enfoque de unión tarde para ser más sensata para plug-in de estilo de grandes piezas de código y funcionalidades que deberían ser intercambiables, etc. actualizable después del despliegue o incluso durante el tiempo de ejecución.
Bueno, mi situación se encuentra un poco en el medio.
No necesito intercambiar trozos de código sobre la marcha en tiempo de ejecución, el tiempo de compilación está bien. Por lo general, también es una función muy central y de uso frecuente, que no es lógicamente separable en bloques grandes.
Esto me permite atender algo a la solución de la plantilla. Para mí también se ve algo más limpio.
¿Hay alguna mala implicación, las interfaces siguen siendo EL camino para llevar? ¿Cuándo no lo son? ¿Cuál cumple más con el estilo estándar de C++?
Sé que esto es rayano en subjetivo, pero estoy realmente interesado en algunas experiencias. No tengo una copia de Scott Meyers vigente C++ así que puse mis esperanzas en ustedes :)
Bueno, veo un problema al usar plantillas en lugar de interfaces: los requisitos son totalmente implícitos. Cuando tiene que implementar la función virtual pura, se le asigna su firma exacta. Pero cuando ve un tipo de plantilla como _AllocT o Iter, no tiene idea de lo que su clase debe tener ni si incluso tiene que ser una clase. La única forma de saberlo es buscando una documentación decente sobre ella, que tuve problemas para hacer hoy cuando intento crear mi propia clase de asignador compatible con stl. – Virus721
"La única forma de saberlo es buscando una documentación decente sobre ello", o al intentar compilar y ver qué funciones el compilador se queja de no poder encontrar, sí. Además, los Conceptos están destinados a resolver este problema. (E incluso si hubiera sido una interfaz, aún necesitaría encontrar documentación decente.Saber qué funciones anular no es suficiente. También necesita saber cuál debería ser su semántica, y la interfaz no le dice eso). Aún así, tienes razón. Hay una razón por la cual el lenguaje es compatible con ambos. :) – jalf