Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Cursos gratis / Curso de Ada - Unidades genéricas

Curso de Ada - Unidades genéricas

 ****- (10 opiniones)
GNU Free Documentation License Curso gratis de José Alfonso Malo Romero - 16 de Marzo de 2006
Temas Relacionados: Programación estructurada
48. Unidades genéricas

Polimorfismo paramétrico


La idea de reutilización de código surge ante la necesidad de construir programas en base a componentes bien establecidos que pueden ser combinados para formar un sistema más amplio y complejo. La reutilización de componentes mejora la productividad y la calidad del software. El lenguaje Ada soporta esta característica mediante las unidades genéricas.

Una unidad genérica es aquella en la que se manipulan tipos que posteriormente instanciará el usuario, es decir, se utiliza a modo de plantilla. Se pueden hacer unidades genéricas de subprogramas y paquetes. Sintácticamente se podría describir como:

unidad_genérica ::= generic { lista_parámetros_genéricos } ( especificación_subprograma | especficicación_paquete ) lista_parámetros_genéricos ::= identificador { , identificador } [ in [ out ] ] tipo [ := expresión ] ; | type identificador is ( (<>) | range <> | digits <> | delta <> | definición_vector | definición_puntero ) | declaración_privada_de_tipo | declaración_formal_procedimiento | declaración_formal_paquete

Por ejemplo, para reutilizar un procedimiento de intercambio de variables:

generic type TElemento is private; -- Parámetro tipo formal genérico. procedure Intercambiar (X, Y: in out TElemento); procedure Intercambiar (X, Y: in out TElemento) is Temporal : TElemento; begin Temporal := X; X := Y; Y := Temporal; end Intercambiar;

La especificación del subprograma va precedida por la parte formal genérica, que consta de la palabra reservada generic seguida por una lista de parámetros formales genéricos que puede ser vacía.

El subprograma Intercambiar es genérico y se comporta como una plantilla. Hay que destacar que las entidades declaradas como genéricas no son locales, por ello es necesario instanciarlas. Por ello, para poder utilizar la unidad del ejemplo es necesario crear una instancia suya para el tipo que se quiera usar, su sintaxis sería:

instanciación_unidad_genérica ::= ( package | procedure | function ) identificador is new identificador [ ( parámetro_instanciado { , parámetro_instanciado } ) ] ;

Por ejemplo:

procedure Intercambiar_enteros is new Intercambiar (Integer);

Con ello, se puede utilizar el procedimiento para tipos Integer, si se quiere utilizar para cualquier otro tipo basta con volver a instanciarlo para el nuevo tipo con otro nombre o, si se utiliza el mismo identificador en la instanciación, se sobrecarga el procedimiento y puede ser utilizado para distintos tipos:

procedure Inter is new Intercambiar (Float); procedure Inter is new Intercambiar (TDía); procedure Inter is new Intercambiar (TElemento => TPila);

De igual modo, se pueden emplear paquetes genéricos, por ejemplo, para implementar una plantilla del tipo abstracto de datos pila:

generic -- Especificación unidad genérica. Max: Positive; -- Parámetro bjeto formal genérico. type TElemento is private; -- Parámetro tipo formal genérico. package Plantilla_pila is procedure Poner (E: TElemento); function Quitar return TElemento; end Plantilla_pila; package body Plantilla_pila is -- Cuerpo unidad genérica. Pila: array(1..Max) of TElemento; Cima: Integer range 0..Max; -- ... end Plantilla_pila;

Ahora se podría utilizar una pila de un tamaño y tipo determinados, para ello, habría que crear un ejemplar, por ejemplo, de esta manera:

declare package Pila_reales_de_100 is new Plantilla_pila (100, Float); use Pila_reales_de_100; begin Poner (45.8); -- ... end; [editar]

Parámetros de unidades genéricas


Resaltar que los objetos declarados como parámetros formales son de modo in por defecto y pueden ser in o in out, pero nunca out. En el caso de que sea in, se comportará como una constante cuyo valor lo proporciona el parámetro real correspondiente. Como resulta obvio, un parámetro genérico in no puede ser de un tipo limitado, pues no se permite la asignación y el parámetro formal toma su valor mediante asignación. En el caso de que el parámetro genérico sea de modo in out, se comporta como una variable que renombra al parámetro real correspondiente; en este caso, el parámetro real debe ser el nombre de una variable y su determinación se realiza en el momento de la creación del ejemplar.

Además de parámetros genéricos de tipo y objetos, se pueden incluir parámetros formales de subprogramas o paquetes, por ejemplo:

generic type TElem is private; with function "*" (X, Y: TElem) return TElem; function cuadrado (X : TElem) return TElem; function cuadrado (X: TElem) return TElem is begin return X * X; -- El operador "*" formal. end cuadrado;

Se utilizaría, por ejemplo, con matrices (teniendo previamente definida la operación de multiplicación de matrices), de la siguiente manera:

with Cuadrado; with Matrices; procedure Prueba_operaciones is function Cuadrado_matriz is new Cuadrado (TElem => Matrices.TMatriz, "*" => Matrices.Producto_matrices); A: TMatriz := TMatriz.Identidad; begin A := Cuadrado_matriz (A); end Prueba_operaciones;

Los tipos formales de un genérico se pueden especificar para que pertenezcan a una determinada clase de tipos.

|| Tipo formal || Instanciable con ||
|| type T is private; || Cualquier tipo con operador de igualdad y asignación definidos ||
|| type T (D : TD) is limited private; || Cualquier tipo con discriminante de tipo TD ||
|| type T (<>) is private; || Cualquier tipo con cualquier discriminante ||
|| type T is limited private; || Cualquier tipo (sea limitado o no) ||
|| type T is (<>); || Cualquier tipo discreto ||
|| type T is range <>; || Cualquier tipo entero con signo ||
|| type T is delta <>; || Cualquier tipo de coma fija ||
|| type T is digits <>; || Cualquier tipo de coma flotante ||
|| type T is array (I) of E; || Cualquier tipo array con índice I y tipo de elementos E (I y E podrían ser a su vez otros parámetros formales) ||
|| type T is access O; || Cualquier tipo puntero que apunte a objetos de tipo O (O podría ser a su vez otro parámetro formal) ||

En el cuerpo sólo podemos hacer uso de las propiedades de la clase de tipo del parámetro real. Es decir, a diferencia de las plantillas de C++, la especificación del genérico es un contrato que ha de cumplir la implementación.
Tabla de contenidos
  1. 1 - Introducción
  2. 2 - Historia
  3. 3 - Manual de referencia
  4. 4 - Instalación
  5. 5 - Hola Mundo
  6. 6 - Elementos del lenguaje
  7. 7 - Tipos
  8. 8 - Enteros
  9. 9 - Enumeraciones
  10. 10 - Coma flotante
  11. 11 - Coma fija
  12. 12 - Arrays
  13. 13 - Strings
  14. 14 - Registros
  15. 15 - Registros discriminados
  16. 16 - Registros variantes
  17. 17 - Punteros a objetos
  18. 18 - Punteros a subprogramas
  19. 19 - Tipos derivados
  20. 20 - Tipos etiquetados (orientación a objetos)
  21. 21 - Subtipos
  22. 22 - Objetos (variables y constantes)
  23. 23 - Atributos
  24. 24 - Expresiones
  25. 25 - Operadores
  26. 26 - Sentencias y estructuras de control
  27. 27 - Subprogramas
  28. 28 - Sobrecarga
  29. 29 - Entrada/salida
  30. 30 - Pragmas
  31. 31 - Interfaz con otros lenguajes
  32. 32 - Diseño y programación de sistemas grandes
  33. 33 - Paquetes
  34. 34 - Clausula use
  35. 35 - Clausula with
  36. 36 - Paquete Standard
  1. 37 - Declaraciones
  2. 38 - Ámbito
  3. 39 - Visibilidad
  4. 40 - Renombrado
  5. 41 - La biblioteca Ada (unidades y subunidades)
  6. 42 - Unidades de biblioteca
  7. 43 - Unidades hijas
  8. 44 - Subunidades
  9. 45 - Compilación separada y dependiente
  10. 46 - Tipos abstractos de datos
  11. 47 - Tipos limitados
  12. 48 - Unidades genéricas
  13. 49 - Excepciones
  14. 50 - Paquete Ada.Exceptions
  15. 51 - Concurrencia
  16. 52 - Tareas
  17. 53 - Sincronización de tareas mediante puntos de entrada o citas (entry)
  18. 54 - Aceptación de citas (accept)
  19. 55 - Selección de citas (select)
  20. 56 - Llamadas a punto de entrada complejas
  21. 57 - Tareas dinamicas: creación dinamica de tareas (tipos t
  22. 58 - Dependencia de tareas
  23. 59 - Ejemplos de tareas
  24. 60 - Programación distribuida con GLADE
  25. 61 - Novedades de Ada 2005
  26. 62 - Unidades predefinidas
  27. 63 - Paquete Ada.Strings.Fixed
  28. 64 - Paquete Ada.Strings.Unbounded
  29. 65 - Paquete Ada.Text_IO
  30. 66 - Paquete Ada.Text_IO.Editing
  31. 67 - Paquete Ada.Float_Text_IO
  32. 68 - Paquete Ada.Sequential_IO
  33. 69 - Paquete Ada.Command_Line
  34. 70 - Paquete Interfaces
  35. 71 - Recursos en la Web
Autor y licencia de 'Curso de Ada - Unidades genéricas'
José Alfonso Malo Romero Extraído de: http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Ada_/_Introducci%C3%B3n GNU Free Documentation License
El contenido está disponible bajo los términos de GNU Free Documentation License
Licencia GNU Free Documentation License: http://www.gnu.org/copyleft/fdl.html
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Curso de Ada - Unidades genéricas'

Excelente curso de iniciación a la astronomía para aquellos que quieran aprender sobre esta apasionante... Más »
La idea de este curso surgió de varias conversaciones entre amig@s de la cuadrilla y... Más »
Este es un curso tremendamente completo, guiado y con ejemplos y prácticas pensadas para convertirlo... Más »
Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
Publicidad, término utilizado para referirse a cualquier anuncio destinado al público y cuyo objetivo es... Más »
Gente Wiki
Nerio Trino, Araujo
Soy licenciado en educacion mencion. Matematicas y fisica. Ejersi como docente en dichas äreas. Actualmente estoy jubilado del ministerio de...
Física
Dervy Jiménez Silva.
Consultor en liderazsgo de excelencia, motivación total y formación en valores, graduado en la universidad de la habana -cuba, con...
Boris Gomez
Ing de sistemas, jefe de sistemas de la universidad de las américas (quito - ecuador), actualmente inmersos en un macro...
Kempis
Soy desarrollador de java, argentino, vivo en mexico y he creado un framework de desarrollo y de implementación llamado officenet2...
Adriana Romero
Soy odontologa egresada de la f. U. S. M. En el 2005, el 1 de febrero regrese de mi...
Armando Jerico Gamez Perez
Soy tecnico en laboratorio clinico y egresado en bioquimica en mi pais natal (peru), estoy laburando en un laboratorio particular...
Analisis y diagnóstico, Técnicos de laboratorio,...
Suscribirse
¿Estás seguro de que deseas eliminar este capítulo?