En la programación genérica , un concepto es una descripción de las operaciones soportadas en un tipo, incluidas la sintaxis y la semántica. De esta manera, los conceptos se relacionan con tipos abstractos pero los conceptos no requieren una relación de subtipo.
El uso del lenguaje
El término ya se usaba en 1998 para STL , [1] ya que esta fue una de las primeras bibliotecas que usó plantillas de manera extensiva. El término concepto (y su popularización) se le atribuye a Alexander Stepanov , [2] [3] el diseñador principal del STL.
En el estándar C ++ 1998, el término Concept se introdujo para nombrar solo una descripción simple de los requisitos para un tipo en particular, que generalmente es un parámetro de plantilla. No se codificó explícitamente en el lenguaje; el concepto se expresó solo por las operaciones que se intentan en objetos de ese tipo y lo que se espera que funcione (es decir, que se compile correctamente). Hubo una propuesta para agregar conceptos como una característica explícita del lenguaje en C ++ 11 , aunque fue rechazada por "no lista".
Como los genéricos en Java y C # tienen algunas similitudes con las plantillas de C ++ , el papel de los conceptos lo desempeñan las interfaces . Sin embargo, hay una diferencia importante entre conceptos e interfaces: cuando se requiere un parámetro de plantilla para implementar una interfaz en particular, el tipo coincidente solo puede ser una clase que implemente (explícitamente) esa interfaz. Los conceptos aportan más flexibilidad porque pueden satisfacerse de dos formas:
- definido explícitamente como satisfecho mediante el uso de un mapa conceptual (definido por separado del tipo en sí, a diferencia de las interfaces)
- definido implícitamente para "conceptos automáticos", que se pueden utilizar también para tipos integrados y otros tipos que no estaban predestinados para este uso
Pero el lenguaje C # tiene varias construcciones donde el tipo utilizado no necesita implementar explícitamente una interfaz definida, solo se requiere que coincida con el patrón respectivo (sin embargo, estos patrones no se denominan conceptos ). Por ejemplo, la foreach
declaración de iteración permite que el objeto iterado sea de cualquier tipo, siempre que implemente un GetEnumerator
método apropiado . [4] (Compare con la using
declaración que requiere el recurso para implementar la System.IDisposable
interfaz. [5] )
Otro lenguaje que implementa algo muy similar a los conceptos es Haskell , donde la característica se llama clases de tipos .
Ejemplo
Por ejemplo, si un tipo I
satisface el concepto de iterador trivial en C ++ y i
es de tipo I
, las siguientes son expresiones válidas con la semántica correspondiente: [6]
I i
construcción por defecto.*i
debe ser convertible a algún tipoT
.i->m
es válido si lo(*i).m
es.
Ver también
Referencias
- ^ Austern, MH Programación genérica y STL: uso y ampliación de la biblioteca de plantillas estándar de C ++ . 1998. págs. 17–18
- ^ un poco de antecedentes para conceptos y C ++ 17 — Bjarne Stroustrup , por Bjarne Stroustrup | 26 de febrero de 2016
- ^ Alex Stepanov , por Bjarne Stroustrup | 21 de enero de 2016
- ^ C # 6.0 borrador de especificación , la declaración foreach
- ^ C # 6.0 borrador de especificación , la declaración using
- ^ Iterador trivial