27

Tengo algunas preguntas sobre el concepto de polimorfismo estático Algunas veces escucho; puede interpretarlos principalmente en el contexto de C++, pero agradecería las respuestas independientes del idioma cuando corresponda (, por lo tanto, etiquetar tanto C++ como el lenguaje independiente).Definición e implementación del polimorfismo estático

  1. ¿Cómo definimos polimorfismo estática en general? Como un ejemplo, creo que la función std::sort de C++ se considerará estáticamente polimórfica ya que depende de alguna de las interfaces proporcionada por algunos de los objetos que comportan como iteradores y la comportamiento exacto bajo la interfaz de iteradores proporcionadas se puede determinar en tiempo de compilación ¿Es esta explicación cómo definimos el polimorfismo estático, o es solo una descripción de un caso específico y hay más que eso?

  2. ¿Cuáles son los patrones de código comunes del uso de polimorfismo estático en C++? Además: ¿Es SP solo logrado mediante plantillas en C++?

  3. ¿Es cierto que un diagrama de clase UML dado no directamente describir cómo se maneja polimorfismo y, por lo tanto, puede ser implementado ya sea estática o dinámicamente al menos parcialmente? En otras palabras: ¿la elección del polimorfismo estático frente al dinámico es independiente del modelo OOP y, por lo tanto, depende del implementador decidir?

  4. ¿El polimorfismo estático es solo C++ y está relacionado con el funcionamiento de las plantillas? Si no, ¿está presente en cualquier otro lenguajes principales además de C++? ¿Podemos tener un equivalente de polimorfismo estático en Java, C# ... cualquier cosa, y traerá algún beneficio?

  5. Lo más importante ... ¿Cuáles son los beneficios reales del uso de polimorfismo estático? Creo que podemos estar de acuerdo en que reduce la flexibilidad del código; ¿Cuáles son las ventajas, además, en el caso de C++, de salvar una referencia de referencia (función virtual/puntero a función/costo de delegado)? ¿Cuál es la clase de problemas donde el polimorfismo estático es especialmente útil, la elección correcta para la implementación?

+0

¿Podemos estar de acuerdo en que reduce la flexibilidad del código? –

+1

Creo que quiso decir "complejidad" o posiblemente "redundancia". –

+0

No, me refiero a la flexibilidad; asumiendo que todos los diseños con polimorfismo estático se pueden implementar con polimorfismo dinámico, pero no al revés: usar polimorfismo estático para un caso específico implica que en el futuro podría surgir la necesidad de reescribirlo dinámicamente, si los requisitos cambian. Solo estoy pensando en – Kos

Respuesta

13
  1. El comportamiento polimórfico estático es type polymorphism que se produce en tiempo de compilación en lugar de tiempo de ejecución.
  2. Sí.
  3. UML trata de cómo las clases interactúan en tiempo de ejecución: no creo que haya un formato UML para describir las plantillas, pero podría estar equivocado.
  4. Por lo que yo sé, es específico de C++, pero no estoy seguro ya que no he usado todos los lenguajes que se hayan inventado. :) Dicho esto, los lenguajes JIT como C# y Java a menudo son muy buenos para eliminar el impacto en el rendimiento de las llamadas indirectas en algunos casos al usar información obtenida en tiempo de ejecución en lugar de en tiempo de compilación. Si esto está en tiempo de compilación o no está algo en el aire, después de todo, se llama Compilador Just-In-Time.
  5. El principal beneficio es simplemente el rendimiento. polimorfismo de tiempo de ejecución puede hacer todo el polimorfismo estático puede hacerlo (de hecho, puede hacer más), pero lleva el coste de las llamadas indirectas (que puede ser costoso si hay un número suficiente de ellos)

Ahora, plantillas mismos tienen muchos usos más allá de lograr el polimorfismo en tiempo de compilación; por ejemplo, la magia SFINAE que hace que boost::bind funcione ciertamente no es polimórfica, simplemente está ahí para suavizar inconsistencias en el lenguaje mismo.

+3

"2. Sí". ¿Qué hay sobre la sobrecarga de funciones? –

+1

@Charles: nunca antes había escuchado a nadie sobrecargando el "polimorfismo estático" (aunque creo que encaja). –

+0

Depende de cómo responda (1), por supuesto. –

5

¿Cómo definimos el polimorfismo estática en general?

La mejor manera de entenderlo con ejemplos. Policy Based Design es un ejemplo de polimorfismo estático. Y en mi opinión, es una técnica muy poderosa para lograr el polimorfismo estático.

Otro ejemplo es Curiously recurring template pattern (CRTP) que también es una técnica poderosa.

Cuestiones relacionadas