Antología Programación Orientada a Objetos Guia y Practicas

73
INSTITUTO TECNOLOGICO SUPERIOR DE ZONGOLICA PROGRAMACION ORIENTADA A OBJETOS LSC. RAFAEL JUAN CORDOBA DE LA LLAVE MAYO 2014

description

Guia Antologia Programacion Orientada objetos practica

Transcript of Antología Programación Orientada a Objetos Guia y Practicas

INSTITUTO TECNOLOGICO SUPERIOR DE ZONGOLICA

PROGRAMACION ORIENTADA A OBJETOS

LSC. RAFAEL JUAN CORDOBA DE LA LLAVE

MAYO 2014

I N T R O D U C C I O N

El desarrollo de software en la actualidad ha tomado mucho auge debido a la existencia de lenguajes más amigables. Cada día es más fácil programar. La tecnología de los objetos ha logrado que el llamado programador pase a ser ‘armador’ de programs, es decir, solo arma módulos de programación que alguien hizo y el área de la programación pasa a disminuir, según el tipo de programa. Es un hecho que programar orientado a objetos facilita la programación y eso repercute en los tiempos de desarrollo, lo cual vienen a disminuir considerablemente y también se reduce el costo un programa.

P R O P O S I T O Y C O N T E N I D O El Propósito del curso es proporcionar al alumno los conocimientos necesarios para que pueda programar orientado a objetos. El enfoque sugerido para la materia requiere que las actividades prácticas promuevan el desarrollo de habilidades para la resolución de problemas, tales como: identificación, manejo, control de variables, datos relevantes, planteamiento de hipótesis, trabajo en equipo, asimismo, propicien procesos intelectuales como inducción-deducción y análisis-síntesis con la intención de generar una actividad intelectual compleja; las actividades teóricas se han descrito como actividades previas al tratamiento practico de los temas. En las actividades prácticas sugeridas, es conveniente que el profesor sólo guie al estudiante en la construcción de su conocimiento. En la primera unidad se presentan los conceptos de la programación orientada a objetos, teniendo la intención de introducir al estudiante en los elementos del modelo de objetos así como el uso básico del lenguaje de modelado unificado. La segunda unidad se centra en la definición e implementación de clases y objetos permitiendo al estudiante adquirir las competencias fundamentales de la programación orientada a objetos. La tercera unidad tiene como propósito la creación de objetos que incorporen propiedades y métodos de otros objetos, construyéndolos a partir de éstos sin necesidad de reescribirlo todo. La cuarta unidad trata una de las características fundamentales de la programación orientada a objetos; el polimorfismo, que permite reutilizar métodos

con el mismo nombre, pero con relación a la clase a la que pertenece cada uno, con comportamientos diferentes. En la quinta unidad el estudiante adquirirá los conocimientos para tratar situaciones excepcionales que se presentan en tiempo de ejecución. La unidad seis, el estudiante aplica las operaciones necesarias para el manejo de archivos de texto y binarios, temas que se utilizarán en materias posteriores.

O B J E T I V O Diseñar e implementar objetos de programación que permitan resolver situaciones reales y de ingeniería.

COMPETENCIAS PREVIAS Y RELACION CON CURSOS ANTERIORES Y POSTERIORES

Analizar, diseñar y desarrollar soluciones de problemas reales utilizando algoritmos computacionales para implementarlos en un lenguaje de programación orientado a objetos. Su relación con materias anteriores: Fundamentos de programación Su relación con materias posteriores: Estructura de datos, Tópicos avanzados de programación, Fundamentos de ingeniería de software, Ingeniería de software. Todo lo referente a programación es lo que debe poner atención el alumno para desarrollar programas orientados a objetos con calidad y eficiencia.

CONTENIDO UNIDAD 1 Introducción al paradigma de la programación orientado a objetos. 1.1 Elementos del modelo de objetos: clases, objetos, abstracción, modularidad, encapsulamiento, herencia y polimorfismo. 1.2 Lenguaje de modelado unificado: diagrama de clases. UNIDAD 2 Clases y objetos. 2.1 Declaración de clases: atributos, métodos, ncapsulamiento. 2.2 Instanciación de una clase. 2.3 Referencia al objeto actual. 2.4 Métodos: declaración, mensajes, paso de parámetros, retorno de valores. 2.5 Constructores y destructores: declaración, uso y aplicaciones. 2.6 Sobrecarga de métodos. 2.7 Sobrecarga de operadores: Concepto y utilidad, operadores unarios y binarios.

UNIDAD 3 Herencia. 3.1 Definición: clase base, clase derivada. 3.2 Clasificación. herencia simple, herencia múltiple. 3.3 Reutilización de miembros heredados. 3.4 Referencia al objeto de la clase base. 3.5 Constructores y destructores en clases derivadas. 3.6 Redefinición de métodos en clases derivadas. UNIDAD 4 Polimorfismo.

4.1 Definición. 4.2 Clases abstractas: definición, métodos abstractos, implementación de clases abstractas, modelado de clases abstractas. 4.3 Interfaces: definición, implementación de interfaces, herencia de interfaces. 4.4 Variables polimórficas (plantillas): definición, uso y aplicaciones. 4.5 Reutilización de código. UNIDAD 5 Excepciones. 5.1 Definición. 5.2 Tipos de excepciones. 5.3 Propagación de excepciones. 5.4 Gestión de excepciones: manejo de excepciones, lanzamiento de excepciones. 5.5 Creación y manejo de excepciones definidas por el usuario. UNIDAD 6 Flujos y Archivos. 6.1 Definición. 6.2 Clasificación: Archivos de texto y binarios. 6.3 Operaciones básicas y tipos de acceso. 6.4 Manejo de objetos persistentes.

COMPETENCIAS A ALCANZAR EN EL CURSO Al término del curso el participante: Unidad 1: Introducción al paradigma de la programación orientado a objetos. Comprender, describir y modelar los conceptos principales del paradigma de programación orientado a objetos y aplicarlos a situaciones de la vida real. Unidad 2: Clases y objetos. Implementar clases y objetos cumpliendo las reglas de la programación orientada a objetos. Implementar constructores y destructores para inicializar atributos y liberar recursos. Sobrecargar métodos y operadores para optimizar el código de una clase. Unidad 3: Herencia. Implementar la herencia en clases derivadas para reutilizar los miembros de una clase base. Unidad 4: Polimorfismo. Implementar interfaces y clases polimórficas. Unidad 5: Excepciones. Identificar, manejar, gestionar y crear las condiciones de error que interrumpan el flujo normal de ejecución de un programa.

Unidad 6: Flujos y archivos. Implementar aplicaciones orientadas a objetos que creen y manipulen archivos para guardar y recuperar información.

UNIDAD 1 Introducción al POO Competencia específica de la unidad: Comprender, describir y modelar los conceptos principales del paradigma de programación orientado a objetos y aplicarlos a situaciones de la vida real.

1.1 Evolución de los paradigmas de programación

Evolución de las metodologías de programación En un inicio, los lenguajes de programación no tenían una metodología de programación, por lo que a los desarrolladores sólo les interesaba generar los programas para solucionar los problemas emergentes en sus empresas, lo que traía como consecuencia miles de líneas de código, los cuales eran inaccesibles, incluso para los mismos programadores; darle mantenimiento al programa o realizar modificaciones era casi imposible. Esta expansión sin control tuvo como consecuencia lógica la llamada Crisis del Software. Han existido diferentes etapas en el desarrollo de software, las cuales son:

Código Espagueti o programación secuencial Eran instrucciones de manera secuencial, no existían funciones y los tipos de datos eran globales. En este tipo de programas son grandes líneas de código, donde lo único claro es el inicio y el fin del programa, y dentro del código hace llamados a diferentes líneas de código, lo que las hace confusas y difíciles de modificar.

Programación estructurada Separa los datos de las funciones que los manipulan. Como se muestra en la Figura 1, en donde el dato 2 es utilizado únicamente por el subprograma 2, pero el dato 3 es empleado por los subprogramas 1 y 2. Este tipo de programación surgió como solución a la programación secuencial. En esta etapa los programas son divididos por tareas concretas, de tal forma que existía un programa principal que hacía un llamado a los subprogramas (funciones) cada vez que requería una tarea en específico. Este tipo de programación ha sido muy usada, en lenguajes de programación como C, Pascal, etc. Probablemente sea familiar para ti porque en los cursos de programación anteriores has realizado programas estructurados, el programa principal está representado por la función main y cada función

son los subprogramas controlados por la función main.

Programación orientada a objetos También existen datos y funciones, pero éstos se encapsulan por medio de objetos. Objeto: Es una entidad del mundo real que se puede describir en función de sus características (propiedades) y comportamientos (métodos).

UNIDAD 2 Clases y objetos Competencia específica de la unidad: Implementar clases y objetos cumpliendo las reglas de la programación orientada a objetos. Implementar constructores y destructores para inicializar atributos y liberar recursos. Sobrecargar métodos y operadores para optimizar el código de una clase.

Fundamentos de la programación visual

Un lenguaje de programación es, como todo lenguaje en general, un dialecto; es decir, un conjunto de convenciones utilizadas para comunicarse. De este modo, a través de un dialecto que con el tiempo ha ido evolucionando y mejorando, incluso volviéndose más amigable a la comprensión humana, ésta es la forma en que el hombre se comunica con las máquinas. Hace tiempo, el término programación se refería a una codificación lineal absolutamente crítica y misteriosa, tal vez sea familiar el desarrollo de programas en este tipo de lenguajes (Figura 1), debido a que en los cursos anteriores has programado en C, y supongo que muchas veces te has preguntado cómo y cuándo podrás desarrollar programas con interfaces visuales, en este curso se analizará cómo desarrollar programas con interfaces gráficas.

Figura 4. Programa en modo texto Con la llegada de la informática gráfica todo es visual. Usando los lenguajes tradicionales de programación, los programadores tenían grandes dificultades para implementar aquellos aspectos gráficos que dominan las tareas a desarrollar en los nuevos entornos gráficos.

Figura 5. Programa en lenguaje visual La Programación Visual parte de los lenguajes clásicos de programación (C, Basic, Pascal), generalmente lenguajes orientados a objetos, y descarga de ellos las tareas más tediosas como el control de los eventos o la puesta en escena gráfica. Además, dichos lenguajes de programación cuentan con ayudas para componentes visuales, asistentes, etc., que facilitan más la tarea del programador.

Algunos de los lenguajes visuales han sido denominados RAD (Rapid Application Development), ya que tienen entre su misión acortar el tiempo necesario para realizar un proyecto. Por parte de Microsoft los lenguajes visuales forman parte de la plataforma Visual Studio, que incluyen, entre otros, los lenguajes Visual C++ y el Visual Basic, Borland por su parte,

tienen el Borland C++ Builder y el exitoso Delphi, lenguaje visual derivado del Object Pascal. Los componentes de los lenguajes visuales tienen una parte gráfica, parcialmente ajena a la programación sin ampliar el código fuente. Tiene otra parte de programación al estilo clásico en donde las funciones son ejecutadas por medio de eventos que se disparan en función de las acciones del usuario sobre la parte gráfica.

De esta manera, el programador dedica su mayor esfuerzo en trabajar para encontrar la solución del problema. En estos lenguajes, simplemente se dibujan los botones, cajas de texto y otros objetos visuales (a los que comúnmente se les denomina controles) que intervendrán en la ventana de la aplicación y, en cada uno de ellos, se proporciona el acceso a los eventos que puede responder cada objeto sin necesidad de escribir una sola línea de código, ya que el lenguaje de programación realiza esta tarea en forma transparente al programador.

Programación orientada a eventos

Como ya se mencionó en el tema anterior, existen distintos tipos de programas (inicialmente los programas eran de tipo secuencial). Un programa secuencial es un programa que se arranca, lee los datos que necesita, realiza los cálculos e imprime o guarda en el disco los resultados. Mientras un programa secuencial está ejecutándose no necesita ninguna intervención del usuario. A este tipo de programas se les llama también programas basados u orientados a procedimientos o a algoritmos (procedural languages). Ejemplos de estos programas son PowerPoint, Internet Explorer y cualquier otro programa que al iniciar espera las acciones del usuario que son llamadas eventos. Por ejemplo, cuando se ejecuta Microsoft Word, puedo realizar diferentes acciones, ya sea abrir un documento, hacer un nuevo documento, etc. Las acciones que el usuario puede realizar en un momento determinado son variadísimas, y exigen un tipo especial de programación: la programación orientada a eventos. Este tipo de programación es sensiblemente más complicada que la secuencial, pero con los lenguajes visuales de hoy, se hace sencilla y agradable. Antes de continuar, es necesario definir algunos conceptos de los elementos de Programación Orientada a Eventos. Evento: Son las acciones del usuario sobre el programa. Son eventos típicos el click sobre un botón, el hacer doble click sobre el nombre de un fichero para abrirlo, el arrastrar un icono, el pulsar una tecla o combinación de teclas, el elegir una opción de un menú, el escribir en una caja de texto, o simplemente mover el ratón.

Figura 6. Click . Propiedades y métodos

Además de los eventos, la mayor parte de los objetos, como los formularios y los controles, son suministrados con propiedades y métodos. Propiedades: Una propiedad es una asignación que describe algo sobre un objeto, como un formulario. Dependiendo de la propiedad, se la puede asignar en tiempo de diseño usando la ventana Propiedades y/o en tiempo de ejecución al programar. Las propiedades también son llamadas características, por ejemplo, las propiedades de una persona son: nombre, edad, sexo, estado civil, etcétera. A continuación, describimos dos ejemplos de las propiedades del formulario en Delphi: Text: Esta propiedad especifica el texto asignado a una Tedit. Width: Indica el tamaño de un componente. Métodos: Son funciones que también son llamadas desde el programa, pero a diferencia de los procedimientos no son programadas por el usuario, sino que vienen ya pre-programadas con el lenguaje. Los métodos realizan tareas típicas, previsibles y comunes para todas las aplicaciones. De ahí que vengan con el lenguaje y que se libere al usuario de la tarea de programarlos. Cada tipo de objeto o de control tiene sus propios métodos. En general, los métodos sólo pueden ser usados en tiempos de ejecución, no en tiempo de diseño. Algunos ejemplos de métodos de formularios son el método SHOW, que muestra un formulario. Los métodos son invocados dando nombres al objeto y cuyo método se está llamando, listando el operador punto (.), y después listando el nombre del método. Como cualquier rutina, los métodos pueden incorporar argumentos. Por ejemplo:

Miforma.show();

Este método Show carga y muestra un formulario, dos acciones distintas que forman parte del proceso de nacimiento o inicio a un formulario (al ejecutar el formulario de inicio se carga también el formulario y después se muestra). El método Show puede ser invocado como no modal o modal. Modal significa que no se ejecuta ningún código posterior hasta que el formulario se oculte o se descargue. Cuando se muestra un formulario modal no se puede producir ninguna entrada de usuario (de teclado o click del ratón), excepto para los objetos del formulario modal.

Tarea 1. Cuadro comparativo de paradigmas de programación Instrucciones:Desarrolla de manera individual, un cuadro comparativo entre la programación lineal, estructurada y orientada a objetos con base en el nivel de complejidad que existe al realizar modificaciones a los programas, y en la forma en que se agrupan los datos y funciones.

Forma en que se agrupan los

datos

Permite la creación de funciones

Eficiencia de los programas

Facilidad para realizar

mantenimiento a los programas

Programación secuencial

Programación estructurada

Programación orientada a objetos

M1

Principios básicos de la programación orientada a objetos

Objetivo El estudiante desarrollará un directorio telefónico, empleando la programación orientada a objetos, para ordenar eficientemente la información de los clientes de una empresa.

Preguntas de estudio 1. ¿Qué es una clase? 2. ¿Qué es un objeto? 3. ¿Cuál es la diferencia entre objeto y clase? 4. ¿Cuáles son los elementos que componen a una clase? 5. ¿Qué son las propiedades? 6. ¿Cómo se clasifican los tipos de datos? 7. Menciona cinco tipos de datos primitivos.Si se requiere almacenar una fecha, ¿qué

tipo de dato se puede emplear? 8. ¿Para qué se emplea el tipo de dato bool? 9. ¿Qué es una constante? 10. Menciona un ejemplo de una constante. 11. ¿Cómo se representan las acciones de una clase? 12. ¿Qué es un método? 13. ¿Qué es void? 14. ¿Para qué se usa la palabra reservada return? 15. ¿Qué es un objeto? 16. ¿Qué es una clase? 17. ¿Cuál es la función del constructor?¿Para qué sirve el destructor?

Introducción En este módulo se especifican los principios de la programación orientada a objetos, y su facilidad para programar por enfocarse más a la manera en que piensa el ser humano. La clave de este paradigma es agrupar las variables y funciones en objetos y acceder a éstos por medio de interfaces. En este tema no se programarán todavía en el entorno visual, sino que haremos programas en modo consola. Los temas que se tratarán en este módulo son:

Clases: En este tema se identifican las características, comportamientos u operaciones que se pueden realizar con cada objeto.

Construcción del estado de un objeto: Cada objeto tiene diversas características, por ejemplo, un objeto materia tiene un nombre, créditos y semestre; y cada una de estas características corresponden a un tipo de dato distinto en el lenguaje de programación.

Diseño de métodos: Se refieren a las acciones que se pueden realizar en un objeto en específico, cada objeto puede tener varias acciones, dependiendo de las funciones que se vayan a realizar.

Los objetos como instancias de las clases: En este tema se visualizará que las clases no pueden almacenar datos tal y como lo hacen las variables que hemos empleado en los lenguajes de programación, razón por la cual debemos crear objetos a partir de las clases.

Este módulo te servirá de base para iniciar la programación en un lenguaje visual; acude con tu profesor titular, en caso de que necesites despejar cualquier duda.

Programación orientada a objetos

En el módulo pasado estuvimos analizando tres paradigmas de programación (secuencial, estructurado y orientado a objetos), y llegamos a la conclusión de que la programación orientada a objetos es la más eficiente y que resuelve dos problemas principales de los paradigmas de programación anteriores; el primer problema es obligar a un programador a pensar como la máquina, y el segundo es que si se hiciera un cambio en el formato de alguno de los datos se deben modificar todas las funciones del programa que utilizarán este dato.

¿Por qué la programación orientada a objetos resuelve los problemas mencionados? Esto sucede porque un objeto es una representación de la vida real, es decir, de la forma cotidiana de pensar de las personas. Además, los datos globales que eran empleados por todos los programas desaparecen, en su lugar cada objeto tiene sus propias funciones y datos y si se modifica la estructura de un dato sólo afecta a ese objeto. A continuación, se muestran dos figuras donde se compara la organización de los datos en la programación estructurada y la orientada a objetos.

En la programación orientada a objetos existen elementos muy importantes que son: clases, objetos, propiedades y métodos.

Clase:

Es la descripción de las propiedades de los objetos en conjunto con las operaciones que se permiten con ellos. Encapsula datos y métodos, es como un lenguaje para definir nuevos tipos de datos dentro del lenguaje. Una clase define el comportamiento y atributos de un grupo de objetos de características

similares.

Objeto: Es una entidad del mundo real que se puede describir en función de sus características y comportamientos. Si observas las definiciones, existe una relación muy estrecha entre la clase y el objeto, por lo que podemos decir que una clase es unión de varios objetos. Por ejemplo, se podría decir que una clase es como un molde y los objetos son las gelatinas que se realizan con ese molde, como se muestra en la Figura 3. Se puede observar que cada gelatina tiene la misma forma, pero el color, el sabor y los ingredientes con los que fueron preparadas son distintos; de la misma forma sucede con los objetos, todos tienen las mismas propiedades y métodos, pero con valores distintos.

Figura 3. Analogía entre clases y el molde de una gelatina.

Analizando ejemplos más afines con un lenguaje de programación, podemos mencionar una clase "alumno", y los objetos serán cada uno de los alumnos existentes en una escuela, tal como se muestran en la Figura 4.

Figura 4. Clase "alumno".

Las clases están compuestas por propiedades y métodos, en este caso sólo se explicarán a grandes rasgos estos elementos, debido a que en temas posteriores se detallarán.

Propiedades: Son las características de un objeto, volviendo al ejemplo de la clase "alumnos", las

propiedades pueden ser:

Nombre Sexo Semestre Dirección

Si analizamos lo anterior, podemos decir que todos los objetos (Luis, Jorge, Ana) tienen las mismas propiedades, pero cada uno tiene valores distintos, como se muestra en la Tabla 1; por lo tanto, podemos resumir que un conjunto de objetos que comparten las mismas propiedades forman una clase.

Nombre del objeto

Sexo Semestre Dirección

Luis Masculino 3 Av. Carpio. Jorge Masculino 2 Av. Jazmín Ana Femenino 6 Av. Los Cedros.

Métodos: Son las operaciones que se pueden realizar sobre el objeto, también llamadas acciones. Existen métodos públicos, también conocidos como interfaces, que son los que se comunican con otros objetos; y métodos privados, que realizan operaciones internas entre los objetos. Ejemplos de métodos pueden ser las operaciones que se pueden hacer sobre un objeto alumno, como son:

Inscribirlo Modificar sus datos Incrementar semestre Baja de la institución

En resumen, una clase contiene propiedades y métodos y, si observas, esta forma de programar está relacionada con la vida real. De acuerdo con UML, una clase se representa como un rectángulo con tres divisiones (nombre, propiedades y métodos), como se muestra en la Figura 5.

Figura 5. Clase alumno.

Construcción del estado de un objeto

El estado de un objeto se representa por medio de los atributos, o también llamados propiedades. Como ya se vio en el tema anterior, el conjunto de objetos que tienen las mismas propiedades se llaman clases.

Propiedades Son las características individuales que diferencian a un objeto de otro (Ceballos, 2006). Por ejemplo, en un supermercado se puede identificar la clase "producto", con las propiedades:

Código de barras Nombre Precio Tipo de producto Presentación

Cada una de estas propiedades almacenará valores de diversos tipos, el código de barras almacenará números, el nombre almacenará caracteres alfabéticos y, posiblemente, números (por ejemplo, bold 3), el precio será un valor numérico con punto decimal y así sucesivamente. En los cursos de programación pasados ya hemos analizado que existen diferentes tipos de datos para almacenar valores, de igual forma sucede con lenguajes de programación visual como C#.Net, sólo cambia un poco la nomenclatura y pueden existir algunas variantes con estos tipos, pero, en general, en cualquier lenguaje de programación existen dos tipos de datos, los cuales son:

Tipos de datos primitivos Nos referimos a los tipos primitivos de un lenguaje cuando hablamos de tipos de datos ya definidos y de los que se puede partir para la construcción de expresiones o tipos de compuestos. A continuación se muestra una tabla de los tipos de datos primitivos de C#.

Tipo Descripción Bits Rango de valores Alias SByte Bytes con

signo. 8 -128 – 127 sbyte

Byte Bytes sin signo. 8 0 – 255 byte

Int16 Enteros cortos con 16 [-32.768, 32.767] short

signo. UInt16 Enteros

cortos sin signo.

16 [0, 65.535]

ushort

Int32 Enteros normales. 32 [-2.147.483.648,

2.147.483.647] int

UInt32 Enteros normales sin signo.

32 [0, 4.294.967.295]

uint

Int64 Enteros largos. 64

[-9.223.372.036.854.775.808, 9.223.372.036.854.775.807]

long

UInt64 Enteros largos sin signo.

64 [0-

18.446.744.073.709.551.615] ulong

Single Reales con 7 dígitos de precisión.

32 [1,5×10-45 - 3,4×1038]

float

Double Reales de 15-16 dígitos de precisión.

64

[5,0×10-324 - 1,7×10308]

double

DecimalReales de 28-29 dígitos de precisión.

128

[1,0×10-28 - 7,9×1028]

decimal

Boolean Valores lógicos. 32 true, false bool

Char Caracteres Unicode. 16 [‘\u0000’, ‘\uFFFF’] char

String Cadenas de caracteres. Variable El permitido por la memoria string

Object Cualquier objeto. Variable Cualquier objeto Object

Data Time Fechas y

horas. 8 1/enero/1 a

31/diciembre/1999 00:00:00 AM a 11:59:59 PM

Data Time

Casi todos los tipos de datos los hemos estudiado en los cursos pasados de programación, a excepción del tipo de dato bool, el cual permite almacenar valores true o false, es decir, falso o verdadero, los cuales son contrapuestos, de tal manera que un dato de tipo lógico siempre está asociado a que algo se cumpla o no se cumpla. Ejemplo: Casado (true o false).

Retomando el tema de propiedades de una clase, podemos clasificarlas de acuerdo con el tipo de dato que almacenarán; para la clase producto los tipos de datos de cada propiedad son:

Propiedad

Tipo de dato

Código de barras string Nombre string Precio float Tipo de producto string

Tipos de datos compuestos Consiste en unir tipos de datos primitivos, ya sea del mismo o de diferente tipo. Se dividen en:

Matrices: Es un conjunto de elementos del mismo tipo y se accede a estos elementos por medio de índices. Existen matrices unidimensionales, multidimensionales y escalonadas (matrices donde sus elementos son matrices).

Estructura: Este tipo de dato ya lo hemos empleado en el curso de estructura de datos, y recordarás que se refiere a agrupar variables de diferentes tipos con un mismo nombre. Los tipos de datos estructura fueron la base para la declaración de clases.

Métodos de acceso a las propiedades Los atributos o propiedades deben ser encapsulados dentro del objeto para ser protegidas de posibles modificaciones de otros objetos, es por esto que existen diferentes métodos de acceso. Cabe destacar que los métodos de acceso no sólo son aplicables a las propiedades, también pueden aplicarse a los métodos y controles. En la siguiente tabla se describen los métodos de acceso y su significado.

Métodos de acceso Significado Public Acceso no restringido. Protected Acceso limitado a la clase contenedora o a los tipos derivados

de esta clase. Internal Acceso limitado al proyecto actual. Protected internal Acceso limitado al proyecto actual o a los tipos derivados de

la clase contenedora. Private Acceso limitado al tipo contenedor.

En C#, las clases se definen empleando la siguiente sintaxis: class nombre_clase { ambito_propiedad tipo_propiedad nombre propiedad; } La clase producto se definiría de la siguiente forma: class producto { private string cod_barras; private string nombre; private float precio; private string tipo_prod; }

Constantes Como recordarás, una constante es un valor que no puede ser cambiado durante la ejecución del programa. La sintaxis para declarar constantes es: const <tipoConstante> <nombreConstante> = <valor>; Para declarar la constante pi se realizaría de la siguiente manera: const float pi=3.1416.

Diseño de métodos

El comportamiento de un objeto queda definido por las acciones que puede emprender. Para definir este comportamiento se pueden utilizar tanto métodos como propiedades. Los métodos representan acciones que un objeto puede realizar, mientras que las propiedades representan información sobre un objeto. Por ejemplo, la clase "alumnos" tiene varias acciones, como pueden ser:

Inscribir al alumno al nuevo semestre. Incrementar el semestre. Dar de baja al alumno. Consultar sus datos. Cambiar su domicilio.

Un método Se puede definir como rutinas de código definidas dentro del cuerpo de la clase, que se ejecutan en respuesta a alguna acción tomada desde dentro de un objeto de esa clase, o bien desde otro objeto de la misma o de otra clase (Ceballos, 2006).

Definición de un método Los métodos constan de una cabecera y del cuerpo del método encerrado entre llaves. La sintaxis es la siguiente:

[método de acceso] valor_de_retorno nombre_método([parámetros]) { [definición de variables]; Sentencias; [return expresion] }

Donde, métodos de acceso: Tal y como los atributos deben ser encapsulados para ser protegidos, también los métodos requieren cierta protección, aunque ésta debe ser menor, ya que deben existir métodos que se comuniquen con otros objetos, los cuales son llamados interfaces. Los métodos de acceso son los mismos que los descritos en las propiedades.

Valor de retorno: Especifica el tipo de expresión que retorna el método. Puede ser de cualquier tipo de dato primitivo o compuesto, incluyendo una clase. Además, existe el valor (void), que indica que la función no devolverá ningún valor.

Return: Es la instrucción que se encarga de devolver el resultado de la función. En caso de una función void, se puede escribir return, sin especificar ningún valor.

Parámetros: Son las variables que reciben los valores de los argumentos especificados cuando se invocan los mismos. Consiste en una lista de cero, uno o más identificadores con sus tipos, separados por comas.

Como ya sabemos cómo se definen los métodos, vamos a realizar un método para incrementar el semestre en la clase "alumno".

public void inc_sem { semestre= semestre+1; System.console.WriteLine(semestre); } Si observas, el método de acceso es public para que pueda ser llamado desde otra clase. Como no requiere enviar ningún resultado, empleamos void.

Método Main: Todo programa C# tiene un método denominado Main. Este método es el punto de entrada al programa, y también el punto de salida. Se define de la siguiente manera:

public static void Main(string[] args) { //sentencias; }

Recuerda que desde el inicio del módulo hemos hablado de la clase "alumnos" y poco a poco la hemos codificando, finalmente la clase alumnos se ha concluido, identificando propiedades y métodos.

1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 namespace clase_alumno 5 { 6 class calumno 7 { 8 private string num_control; 9 private string nombre; 10 private sbyte edad; 11 private sbyte semestre; 12 13 public void asigna_num_control( string xnum_control) 14 { 15 num_control = xnum_control; 16 } 17 public void asigna_nombre( string xnombre) 18 { 19 nombre = xnombre; 20 } 21 public void asigna_edad( sbyte xedad) 22 { 23 edad = xedad; 24 } 25 public void asigna_sem( sbyte xsem) 26 { 27 semestre = xsem; 28 } 29 public sbyte inc_semestre() 30 {

31 semestre++; 32 return semestre; 33 } 34 { 35 return num_control; 36 } 37 public string retorna_nombre() 38 { return nombre; 39 } 40 public sbyte retorna_edad() 41 { return edad; 42 } 43 public sbyte retorna_sem() 44 { 45 return semestre; 46 }

47.} 48. } 49. }

En la línea 6 se especifica el nombre de la clase. Las líneas 8 a 11 especifican las propiedades de la clase, desde las líneas 12 a 32 se codifican los métodos. Si analizamos los métodos, observaremos que existen dos métodos por cada propiedad de la clase (asigna_num_control y retorna_num_control), esto debe realizarse así porque las propiedades tienen un acceso private, lo que significa que no es posible acceder a las propiedades de la clase desde otra clase, es por esto que necesitamos métodos públicos que manipulen las propiedades privadas.

Haz click aquí , para seguir las instrucciones de instalación de C# .Net y la creación de proyectos.

Instalación C# .Net Express

Para instalar el Visual Studio C#, es necesario lo siguiente:

1. Microsoft Windows XP.

2. Service Pack 2: Puedes descargarlo de esta dirección:

http://www.microsoft.com/downloads/details.aspx?familyid=049c9dbe-3b8e-4f30-8245-9e368d3cdb5a&displaylang=en

3. .Net Framework: Haz click en esta dirección para descargarlo:

http://msdn.microsoft.com/vstudio/express/downloads/default.aspx

4. Visual C# Express .Net: Una vez que ya están instalados los programas, haz click en esta dirección para descargar el Visual C# .Net:

http://msdn.microsoft.com/vstudio/express/downloads/default.aspx

Para empezar a usar C# Express, haz clickaquí.

Los objetos como instancias de las clases

En los temas anteriores hemos creado clases y definido sus propiedades y métodos, pero no se ha comentado cómo crear objetos a partir de esas clases, regresando a la analogía de la gelatina, podemos decir que hemos visto cómo construir los moldes, pero no hemos visto cómo se realizan las gelatinas.

Para poder crear objetos de una clase y trabajar con ellos, se requiere un método Main, ya que es el punto de entrada y salida de cualquier programa.

Existen varias formas de crear un método Main, pero vamos a tomar la más sencilla y, sobre todo, porque es la forma que más se aplica en la programación orientada a objetos. Y consiste en crear otro archivo (almacenándolo en almacenado en la misma carpeta que la clase) que contenga el método Main.

Creación de objetos:

También se denominan instancias de las clases, y se refiere a emplear las clases como si fueran tipos de datos y a partir de esto crear objetos que permitan almacenar información, es muy importante comentar que las clases por sí solas no pueden almacenar valores, por lo que es necesario crear objetos. La instancia de una clase se realiza de la siguiente manera:

Nombre_clase nombre_objeto = new Nombre_clase();

Por ejemplo, para crear un objeto a partir de la clase alumno, se haría:

CAlumno alumno1 = new CAlumno();

El programa dentro de la función Main se vería de la siguiente forma:

1. static void Main(string[] args) 2. { 3. sbyte nuevo_sem; 4. calumno alumno = new calumno(); 5. Console.WriteLine("Creación del objeto alumno "); 6. alumno.asigna_num_control("96010313"); 7. alumno.asigna_nombre("Fernando"); 8. alumno.asigna_edad(24); 9. alumno.asigna_sem(2); 10. nuevo_sem=alumno.inc_semestre(); 11. System.Console.WriteLine("El nuevo semestre es " + nuevo_sem);

Console.ReadKey();

1. } 2. }

En la línea 4 se define el objeto alumno; posteriormente, las líneas de la 6 a la 9 se llaman a los métodos públicos de la clase calumno para asignarle valores a las propiedades privadas. En la línea 10 se llama al método inc_semestre para incrementar el semestre. Constructores: Un constructor es un método especial de una clase que es llamado automáticamente siempre que se crea un objeto de esa clase. Su función es iniciar el objeto (Ceballos, 2006).

El constructor se distingue de los demás métodos porque no se especifica el valor de retorno y lleva el mismo nombre de la clase. Su definición es:

public nombre_clase(parametros ) { }

Para la clase alumnos un constructor que inicialice todos los datos de la clase sería:

public calumno(string xnum_control, string xnombre, sbyte xedad, sbyte xsemestre) { num_control = xnum_control; nombre = xnombre;

edad = xedad; semestre = xsemestre; }

Probablemente te preguntarás, ¿cómo se hizo en el programa anterior en donde no se creó ningún constructor y aún así el programa funcionó?, la respuesta es muy simple: en C# existen constructores por omisión, los cuales no hacen nada, pero serán invocados cada vez que se construya un objeto sin especificar ningún argumento, en cuyo caso el objeto será iniciado con los valores predeterminados por el sistema (propiedades numéricas con cero, propiedades de tipo cadena con espacio en blanco, etc.) Un constructor por omisión se define:

public nombre_clase { }

Para la clase alumnos un constructor por omisión sería:

public calumno() { }

Es importante comentar que si se crea un constructor que inicializa un objeto, es buena práctica de programación hacer un constructor vacío, porque puede ser necesario crear un objeto en blanco (sin datos).

A continuación, te muestro el código de la clase, agregándole el constructor de la clase alumnos:

class calumno { private string num_control; private string nombre; private sbyte edad; private sbyte semestre; public void asigna_num_control(string xnum_control) { num_control = xnum_control; } public void asigna_nombre(string xnombre) { nombre = xnombre; } public calumno() //Constructor implícito {

} public calumno(string xnum_control, string xnombre, sbyte xedad, sbyte xsemestre) { num_control = xnum_control; nombre = xnombre; edad = xedad; semestre = xsemestre; } public void asigna_edad(sbyte xedad) { edad = xedad; } public void asigna_sem(sbyte xsem) { semestre = xsem; } public sbyte inc_semestre() { semestre++; return semestre; } } }

El programa que contiene la función Main se vería de la siguiente manera:

1. namespace clase_alumno 2. { 3. class Program 4. { 5. static void Main(string[] args) 6. { 7. sbyte nuevo_sem; 8. calumno alumno = new calumno("96010313", "Fernando", 24, 2); 9. calumno alumno_en_blanco = new calumno(); 10. Console.WriteLine("Creación del objeto alumno "); 11. nuevo_sem=alumno.inc_semestre(); 12. System.Console.WriteLine("El nuevo semestre es " + nuevo_sem); 13. Console.ReadKey(); 14. } 15. } 16. }

En la línea 9 se declara un objeto denominado alumno_en_blanco, que inicialmente no contiene datos porque ha sido creado con un constructor implícito, pero que en cualquier parte del programa se le pueden asignar valores.

Destructores:

Cada vez que creamos un objeto se reserva espacio en memoria, pero ¿qué pasa cuando ya no se ocupa este objeto?, ¿como liberar espacio en memoria?, C# se encarga de hacerlo cuando el objeto no se utilice, cosa que ocurre cuando ya no existe ninguna referencia al mismo. Por ejemplo, cuando finaliza la función Main se libera toda la memoria de los objetos relacionados. Al crear destructores se debe tomar en cuenta lo siguiente: Los destructores no se pueden definir en estructuras. Sólo se utilizan con clases. Una clase sólo puede tener un destructor. Los destructores no se pueden heredar ni sobrecargar. No se puede llamar a los destructores. Se invocan automáticamente. Un destructor no permite modificadores de acceso ni tiene parámetros. La definición de un destructor se hace de la siguiente manera:

~ Nombre_clase () { //codigo }

Para la clase alumnos el destructor sería el siguiente:

~calumno() { Console.WriteLine(“Objeto alumno eliminado”); }

Recuerda que un destructor no puede ser llamado implícitamente, por lo tanto, en la función donde se está creando y operando el objeto (la función Main) no sufre ningún cambio y, sin embargo, podemos visualizar en la Figura 1 que al finalizar el programa sí se invocó al destructor porque se imprime en pantalla el mensaje "Objeto alumno eliminado").

Figura 1. Creación y destrucción de un objeto.

Y probablemente te preguntes: ¿cómo se destruye el objeto?, no puede ser posible que el mensaje de “objeto alumno eliminado” sea una instrucción que libere a un objeto de la memoria que ocupa, la razón es que C# cuenta con una herramienta denominada recolector de basura que busca objetos que no se utilizan, con el fin de destruirlos, liberando así la memoria que ocupan. Antes de que un objeto sea destruido, C# invoca automáticamente al método destructor, lo que nos permite realizar ciertas operaciones, por ejemplo, cerrar un archivo o base de datos.

Resumiendo, un destructor libera de la memoria a objetos que ya no se usan, C# lo hace automáticamente, y sólo se debe codificar un destructor cuando indirectamente el objeto a destruir haya abierto una base de datos o un archivo o cualquier operación distinta que no pueda ser finalizada al destruir el objeto.

Tarea 2. Identificar cinco clases Instrucciones: Identifica de forma individual, en tu entorno laboral o social cinco clases, definiendo sus propiedades, así como sus tipos de datos y métodos de acceso. Para realizar esta actividad:

1. Identifica los puntos clave del tema. 2. La actividad requiere que observes en tu entorno con una actitud crítica,

recordando que cualquier persona, animal o cosa puede ser representado como un objeto.

3. Una vez que hayas elegido al objeto, procede a definir la clase, identificando para cada propiedad el método de acceso, tipo de dato y nombre, como se muestra en el ejemplo:

class Producto { private string cod_barras; private string nombre; private float precio; private string tipo_prod; }

Tarea 3. Diseño de una clase para crear un directorio telefónico Instrucciones: Diseña individualmente una clase para almacenar datos en un directorio telefónico, especificando las propiedades y métodos necesarios.

Instrucciones para creación de un proyecto en Visual C# 2005 1.-Abrir el programa Microsoft Visual C# 2005 Express.

2.-Hacer clic en archivo/Nuevo proyecto. Y hacer lo siguiente: a) Seleccionar Aplicación de consola. b) Especificar el nombre del proyecto. c) En la ubicación del proyecto, se refiere a la ruta donde será almacenado el proyecto, aunque C# crea una carpeta por cada proyecto, te recomiendo crear un directorio para almacenar todos tus proyectos. d) Hacer clic en aceptar.

3.-¡A Iniciar a programar!

Tarea 4. Diseñar la clase Main para un directorio telefónico

Instrucciones:Realizar de forma individual, la clase con un método Main, para ejecutar la clase del directorio telefónico.

En los temas anteriores ya se definieron los métodos y propiedades, pero al ejecutar el programa notarás que no realizaba ninguna acción, esto sucede porque se requiere la función Main en la cual se crea el objeto y se manipulan sus procedimientos y funciones. La clase Main debe contener un menú con las siguientes opciones: Inserción de datos en el directorio Consulta de datos Modificación de los datos del directorio Borrar el directorio Las propiedades de la clase directorio deben ser privadas, por lo tanto, debes emplear los métodos para acceder a las propiedades. Posteriormente, comprime los archivos generados en el programa y nombra a la carpeta comprimida que vas a subir a la plataforma como se muestra a continuación: Tarea4NombreApellido.zip (por ejemplo: Tarea4IsmaelContreras.zip)

Diseño de interfaces gráficas

Objetivo

El estudiante diseñará una interfaz gráfica, utilizando el lenguaje de programación visual, que servirá de base para crear un sistema de información enfocado hacia procesos administrativos.

Preguntas de estudio 1. ¿Cuáles son los elementos del Entorno Integrado de Desarrollo de Visual Studio? 2. ¿Qué es una solución? 3. ¿Qué es un proyecto? 4. ¿Qué es una propiedad? 5. ¿Qué es un formulario? 6. ¿Cuál es la función de la propiedad StartPosition? 7. ¿Cómo se pueden enlazar dos formularios? 8. ¿Qué es icon? 9. ¿Para qué sirve la propiedad WindowState? 10. ¿Cómo se clasifican los controles? 11. ¿Cuál es la función del label? 12. ¿Para qué sirve la propiedad passwordchar? 13. ¿Para qué se puede emplear la propiedad sizemode? 14. ¿Cuáles son las dos formas de asegurar la integridad y la consistencia de la base de

datos? 15. ¿Cuándo se activa el evento KeyPress? 16. ¿Qué significa que un control tenga el foco? 17. ¿Para qué es empleado en este tema el código ASCII? 18. ¿Cuál es la función de la clase Canvas? 19. ¿Cuál es la función del operador "+" en tipos de datos string? 20. ¿Cómo se convierte un tipo de dato entero a string?

Introducción

Es hora de iniciar con las interfaces gráficas, de olvidarse un poco de crear nuestras interfaces con un sinfín de líneas de código y sólo preocuparnos por la funcionalidad de la aplicación. Los lenguajes de programación visual nos proporcionan todas las herramientas para crear aplicaciones de manera muy intuitiva con sólo arrastrar controles sobre los formularios. En este módulo los temas que se analizarán son: Elementos del entorno integrado de desarrollo: Se refiere a la estructura gráfica del entorno integrado de desarrollo de Visual C# 2005 Express. Formularios: También llamados ventanas, son la base de cualquier aplicación, en este tema se abordarán las principales propiedades de los formularios, así como sus eventos y la forma de controlar a varios formularios en un mismo proyecto.

Controles básicos y sus propiedades: En todos los lenguajes visuales existe un conjunto de controles que permite la interacción con el usuario, ya sea para introducir datos o para mostrar resultados de cierto proceso. En este tema se analizarán los controles más importantes y sus propiedades. Validaciones en controles de edición: En cualquier sistema de información el usuario no es el culpable de los errores cometidos, por lo tanto, toda la responsabilidad cae sobre el programador, quien debe asegurarse de implementar ciertas restricciones sobre los controles de edición para evitar que el usuario ingrese datos erróneos. Operaciones aritméticas: Las operaciones aritméticas son un tema sencillo y, sobre todo, para ti, porque en cursos pasados de programación has realizado ciertos cálculos, pero el problema radica cuando se desea hacer operaciones con datos introducidos por el usuario en controles de edición, ya que éstos son de tipo string y, como recordarás, las operaciones aritméticas deben ser realizadas sobre datos numéricos.

Diseño de interfaces gráficas

Elementos del Entorno Integrado de Desarrollo de Visual C# En este módulo iniciaremos con la creación de interfaces gráficas, empleando un lenguaje de programación visual que permita ahorrarnos una gran cantidad de líneas de código al crear etiquetas, botones y demás componentes visuales. En el módulo anterior ya empleamos el Entorno Integrado de Desarrollo Visual C# 2005 Express, por lo que resultará familiar el desarrollo de estas aplicaciones. Visual Studio permite diseñar la interfaz gráfica de una aplicación de manera visual, sin más que arrastrar con el ratón los controles que necesitamos sobre la ventana destino de los mismos, además, las propiedades de cada control nos permitirán modificar algunos valores (color, tamaño, tipo de letra), todo esto se hace sin escribir ni una sola línea de código. Obviamente, en cualquier lenguaje de programación es necesario escribir el código fuente, pero gracias al entorno de Visual Studio, es fácil identificar errores, además, permite completar código, por ejemplo, el escribir el nombre de un control muestra automáticamente todas las propiedades y métodos asociados. Para crear una aplicación visual, debes seguir los pasos para crear un proyecto que se mencionaron anteriormente, pero en el paso 2a selecciona Aplicación para Windows.

Elementos del entorno integrado de desarrollo de Visual C# 2005 Express. Una vez creada la aplicación para Windows, se mostrará el formulario, form1, además el entorno integrado de desarrollo está compuesto por: a) Barra de herramientas. b) Diseñador. c) Explorador de soluciones.

d) Propiedades. e) Editor de código.

Figura 1. Elementos del Editor de Visual Studio .Net.

Figura 2. Editor de código

. Diseñador: Esta área está compuesta por todos los formularios que componen el proyecto. El formulario es el plano de fondo para los controles, por medio del cual se dibujan las cajas de texto, botones o etiquetas, obteniendo con esto una interfaz gráfica que el usuario utilizará para comunicarse con la aplicación.

Barra de herramientas: Conjunto de controles que nos permite agregar elementos a un formulario con sólo hacer click sobre un control y arrastrarlo a la barra de herramientas. En el próximo tema se detallarán las propiedades de los controles más empleados. Si la barra de herramientas no está visible, selecciona en el menú textual ver/cuadro de herramientas, cabe hacer mención que los controles sólo pueden ser visibles cuando un formulario está activo.

Explorador de soluciones: Muestra el nombre de la solución (conjunto de varios proyectos), el nombre del proyecto, y el de todos los formularios y módulos; en este caso se especifica el nombre de la solución (solución WindowsApplication4 (1 proyecto), el

nombre del proyecto (WindowsApplication4), y los elementos del proyecto (Form1.cs); si observas, existen dos archivos Form1.Designer.cs y el Form1.cs; el primero es el utilizado por el diseñador de formularios y el segundo es empleado para escribir el código.

Figura 3. Explorador de soluciones.

Propiedades: Como ya se mencionó en los módulos pasados, cada clase de objeto tiene predefinido un conjunto de propiedades, como nombre, color, tamaño. Por lo general, todas las propiedades ya tienen valores establecidos, pero éstos pueden ser modificados por el programador en tiempo de diseño. Existe una propiedad denominada tag, la cual está reservada para que el programador asigne un valor relacionado con el control. En el próximo tema se especificarán los controles básicos y sus propiedades.

Editor de código: Es el área destinada a escribir el código fuente de las aplicaciones, por ejemplo, si seleccionamos un botón y hacemos click derecho en ver código, la página de diseño será sustituida por el editor de código. Visual Studio proporciona varias características que son de gran ayuda para el programador: bloques de código contraíbles (todo el código de un if puede contraerse en una sola línea), finalización de código (al escribir el nombre de un control muestra todas las propiedades y métodos de éste).

Formularios

Es el plano de fondo de los controles, se puede decir que es un contenedor de controles; si observas, todas las aplicaciones visuales parten de un formulario, comúnmente llamado ventana. Pueden existir varios formularios en el mismo proyecto, pero uno de éstos será el principal y llamará a todos los demás. Un formulario es tratado como una clase y a partir de éste se pueden crear varios objetos formulario. Al igual que los controles básicos, los formularios también contienen propiedades y métodos, los más importantes son:

Propiedades principales de los formularios: Name: Especifica el nombre del formulario.

StartPosition: Determina la posición del formulario cuando aparece la primera vez, los valores pueden ser: (Normal, CenterScreen, CenterParent, WindowsDefaultLocation, WindowsDefaultBounds). Text: Título del formulario. WindowState: Indica el estado visual inicial del formulario, sus valores son: (Normal, Minimized, Miximized). Icon: Indica el icono para un formulario. Este icono se muestra en el cuadro de menú del sistema del formulario y cuando el formulario se minimiza. La imagen por mostrar debe tener la extensión .ico. BackColor: Color de fondo del formulario. Enlace entre formularios: Un proyecto está compuesto por varios formularios, por lo tanto, son necesarias algunas líneas de código para llamar a otros formularios, tal y como se muestra en la Figura 1, en donde el formulario 1 hace un llamado al 2.

Figura 1. Enlace entre formularios. Para crear y enlazar formularios se realiza lo siguiente: 1. Agregar un formulario a la aplicación. a) Hacer click en el menú textual en la opción proyecto/Agregar nuevo elemento. b) Seleccionar Windows forms y especificar el nombre del nuevo formulario.

Figura 2. Agregar nuevo elemento.

2. Para llamar a otro formulario es necesario hacer lo siguiente: a) Hacer doble click sobre el formulario 1 y escribir: Definir un objeto de tipo Form, y hacer una instancia con el formulario que se llamará: Form nombre_objeto = new Formulario_a_mostrar ; Ejemplo: Form forma2 = new Form2; Mostrar el formulario, empleando el método show ; Nombre_objeto.show(); Ejemplo: forma2.show();

Controles básicos y sus propiedades

Los controles están contenidos en el cuadro de herramientas, y permiten crear interfaces gráficas sin necesidad de escribir código; existen dos tipos de controles: Visuales: Pueden ser vistos y manipulados por el usuario en tiempo de ejecución. No visuales: Se insertan en el formulario y tienen una función sobre el programa, por

ejemplo, la conexión con una base de datos, pero no pueden ser vistos en tiempo de ejecución. Visual Studio clasifica sus controles en varias categorías, las cuales son:

Controles comunes. Contenedores. Menús y barras de herramientas. Datos. Componentes. Impresión. Cuadros de diálogo.

Resultaría muy extenso abordar en este curso todos los controles, por lo que sólo analizaremos los necesarios para crear sistemas de información. Cada clase de objeto tiene predefinido un conjunto de propiedades, tales como nombre, tamaño color, etc. Las propiedades de un objeto representan todos los atributos que por definición están asociados con ese objeto. Existen propiedades comunes para todos los objetos, tal es el caso de la propiedad name, en cambio, algunas propiedades son únicas para un control, por ejemplo, el interval, el cual es único para el timer.

Para modificar las propiedades de un control, se debe realizar lo siguiente: 1. Seleccionar el control. 2. Hacer click derecho y seleccionar la opción propiedades. 3. Seleccionar en la lista propiedades, la propiedad que desea modificar.

A continuación, se analizarán los controles más comunes y sus propiedades. Label: Es una etiqueta que permite mostrar un texto que no puede ser modificado por el usuario, sus propiedades comunes son: Name: Indica el nombre utilizado en el código para identificar el objeto. Text: Es empleada para mostrar información al usuario en tiempo de ejecución. Font: Fuente utilizada para mostrar texto en el control. Forecolor: Color del texto. TextBox: Es una caja de texto, sirve para ingresar datos desde el teclado o cualquier otro dispositivo de entrada, además, permite mostrar información. El TextBox también tienen las propiedades mencionadas para el label, pero existen otras propiedades como son: Maxlength: Especifica el número máximo de caracteres permitidos. Passwordchar: Indica el carácter que se debe mostrar cuando se escriben contraseñas. Multiline: Especifica si el texto puede ser de una o varias líneas. Button: Un botón de pulsación normalmente tendrá asociada una orden con él. Esta orden se ejecutará cuando el usuario haga click sobre el botón. Comparte las mismas propiedades del label. ListBox: Contiene una lista de elementos de la que el usuario puede seleccionar uno o

varios elementos. Sus propiedades principales son: Ítems: Permite ingresar elementos a un cuadro de lista. SelecctionMode: Indica si el cuadro de lista debe ser de selección simple, múltiple o no seleccionable. ComboBox: Es una combinación de caja de texto y lista desplegable, por lo tanto, hereda las propiedades del cuadro de lista y de la caja de texto. PictureBox: Permite insertar imágenes al formulario, las propiedades principales son: Image: Especifica la imagen mostrada. SizeMode: Controla el tamaño de la imagen, por ejemplo, si la imagen es más grande que el PictureBox, puedo cambiar el valor de esta propiedad a strechimage para ajustar la imagen al tamaño del PictureBox. En la Figura 1 se muestran todos los controles mencionados en este tema.

Figura 1. Controles básicos.

MenuStrip Es una forma de proveer al usuario de un conjunto de órdenes, lógicamente relacionadas, agrupadas bajo un mismo título. El conjunto de todos los títulos correspondientes a los menús diseñados aparecerán en la barra de menús situada debajo del título del formulario.

Figura 2. Menú.

Para crear un menú realiza los siguientes pasos:

Arrastrar de la barra de herramientas un control MenuStrip sobre el formulario. Esta acción abrirá el editor de menús que permitirá añadir los menús a la barra de herramientas.

Introducir el título del menú. Escribe en la caja de texto “Escriba aquí” el título del menú que se desea crear, el cual aparecerá en la barra de menús.

Insertar submenú. Hacer click en el menú al que se desea agregar un submenú, y escribe en la caja de texto “Escriba aquí”, el título del submenú que deseas crear.

Casillas de verificación: Es un control que indica si una opción particular está activada o desactivada. Cada casilla de verificación es independiente de las demás, ya que cada una de ellas tiene su propio identificador. El número de opciones representadas de esta forma puede ser cualquiera, y de ellas el usuario puede seleccionar todas las que desee cada vez. Puedes usar las casillas de verificación para indicar tus preferencias en deportes, por ejemplo, si observas la Figura 3, en deportes preferidos puedes seleccionar natación o tenis, y si lo deseas puedes seleccionar las 3 opciones.

Figura 3: Casillas de verificación.

Para crear una casilla de verificación sigue los siguientes pasos: 1. Arrastra desde la barra de herramientas un checkBox. 2. Escribe en la propiedad text, el texto deseado. 3. La propiedad check de tipo booleano indica si la casilla de verificación se ha seleccionado.

Validaciones en controles de edición

Validaciones en controles de edición Los sistemas de información requieren el ingreso de datos ya sea mediante teclado o desde algún dispositivo de entrada como lector de código de barras. Muchas veces el usuario introduce datos que no son válidos, por ejemplo, en el campo edad introduce letras o en el nombre de una persona introduce letras y números, etc., estos errores no deben ser permitidos por el sistema de información; por lo tanto, el programador debe aplicar ciertos mecanismos para asegurar la integridad y consistencia de la base de datos, las restricciones pueden ser:

A nivel de la base de datos: Se refiere a ciertas reglas de integridad de dominios que se definen al crear las tablas, pero estos temas serán abordados en cursos posteriores de base de datos.

A nivel de Lenguaje de programación: Se definen ciertas restricciones sobre los caracteres que se introducen a los controles de edición (cajas de texto, combobox). Algunas validaciones que pueden realizarse son:

o Al estar escribiendo sobre un control de edición (cajas de texto, combobox) y presionar la tecla intro, el cursor se posiciona en el siguiente control.

o Controles que sólo acepten caracteres numéricos. o

Al estar escribiendo sobre un control de edición (cajas de texto, combobox) y presionar la tecla intro, el cursor se posiciona en el siguiente control:

Para realizar esta operación vamos a programar un evento (acción realizada por el usuario) de la caja de texto. Cada vez que el usuario presiona una tecla de tipo carácter se activa el evento KeyPress, que recibe como parámetro el valor ASCII de la tecla pulsada (el valor de la tecla intro es 13), por lo tanto, para programar este evento es necesario realizar lo siguiente 1. Crear un formulario con dos cajas de texto. 2. Seleccionar la primera caja de texto y hacer click derecho eligiendo propiedades. 3. En la ventana propiedades seleccionar el botón eventos. 4. Seleccionar el evento KeyPress, y hacer doble click sobre éste.

Figura 1. Eventos de la caja de texto.

5. Escribir el código necesario en la función.

Figura 2. Código del programa.

Si observas en la Figura 2, la función KeyPress recibe dos parámetros (sender, e), el parámetro e contiene varias propiedades, una de éstas es keyChar que contiene el valor ASCII de la tecla pulsada, por lo tanto, debemos hacer una condición que valide cuando el usuario presiona la tecla intro (13)y posicione el cursor (foco) en la siguiente caja de texto.

Así mismo, debemos escribir el siguiente código: if (e.KeyChar == 13) //posiciona el foco de entrada en la segunda caja de texto textBox2.Focus(); Controles que sólo acepten caracteres numéricos Existen valores de tipo numérico y que no pueden aceptar valores alfabéticos, por ejemplo: la edad, semestre, número de edición de un libro, capacidad de disco duro, precio y existencia de un producto. Para restringir los valores de una caja de texto o cualquier control de edición se debe hacer lo siguiente: 1. Programar el evento keyPress de la caja de texto (sigue los pasos 2 a 5 del programa anterior). 2. Buscar los valores ASCII del rango de números: 0= 48 1=49 2=50 . . . 9=57 3. El parámetro e tiene una propiedad denominada handled de tipo boolean (falso/verdadero). Sus acciones son: e.handled = true; //cancela la tecla presionada e.handled= false; //permite escribir sobre el control de edición la tecla presionada. 4. Se necesita una condición para preguntar si la tecla presionada no está dentro del rango establecido (48 a 57), para asignar el valor de e.handled = true; if(!(e.KeyChar >=48 && e.KeyChar <=57)) El signo ! niega la expresión y se traduce como: “Si la tecla presionada no es mayor o igual a 48 y no es menor o igual a 57”. 5. Por lo tanto, el código resultante es: if (!(e.KeyChar >= 48 && e.KeyChar <= 57) ) e.Handled = true; 6. Al ejecutar el programa notarás que, si por error introdujiste un número incorrecto, la tecla retroceso no funciona, obviamente esto sucede porque sólo especificamos números de 0 a 9. Para solucionar este problema debemos hacer lo siguiente: a) El valor de la tecla retroceso = 8. b) Por lo tanto, el código anterior se modifica: if (!((e.KeyChar >= 48 && e.KeyChar <= 57) || (e.KeyChar == 8))) e.Handled = true; Lo que se traduce como: "Si la tecla presionada no es mayor o igual a 48 y no es menor o igual a 57 o no es igual a 8”.

Campos obligatorios En cualquier aplicación deben existir campos obligatorios, es decir, que si no se introduce algún dato no es posible almacenarlo; por ejemplo, cuando creaste tu cuenta de correo, en el campo nombre y contraseña debería tener un valor porque, de lo contrario, al enviar los datos mostraba un mensaje que no era posible guardar los datos. De la misma forma sucede con los sistemas de información, se requiere ciertos datos que son obligatorios (número de control, nombre), estas validaciones son realizadas al guardar o modificar los datos, por lo tanto, se deben programar en el evento click del botón guardar.

1. Hacer doble click en el botón guardar. 2. Verificar si el campo obligatorio es nulo if(txtNumControl == “”). 3. En caso de que el campo sea nulo, enviar un mensaje MessageBox.Show(“Escriba número de control”). 4. Posicionar el foco en la caja de texto correspondiente txtNumControl.Focus(). 5. Cuando no existe un dato, no es necesario seguir validando los demás controles, por lo que se recomienda concluir la función por medio de la expresión return. 6. El código quedaría de la siguiente manera: if (txtNombre.Text == "") { MessageBox.Show("Falta nombre"); return; } if (txtNumControl.Text == "") { MessageBox.Show("Falta número de control "); return; }

Operaciones aritméticas

Operaciones aritméticas Por lo regular, en todo procesamiento de información se requiere realizar operaciones matemáticas, ya sean simples funciones aritméticas o funciones trigonométricas y cálculos especiales. Las operaciones matemáticas ya las has realizado en otros cursos de programación, pero aquí la problemática surge cuando dichas operaciones son realizadas con datos introducidos por el usuario en controles, tales como cajas de texto, combobox o cualquier control de edición, debido a que estos controles son de tipo string y las operaciones matemáticas requieren tipos numéricos. Si se realizara una operación de multiplicación (*), el código sería: TxtResul.Text = TxtNum1.Text * TxtNum2.Text; En la Figura 1 se muestra la operación que causará un error porque se está haciendo una multiplicación con tipos de datos string.

Figura 1. Multiplicación de dos números.

Figura 2. Mensaje de error.

El mensaje de error de la Figura 2, sucede porque no se pueden realizar operaciones de multiplicación con tipos de datos string. El único operador matemático que puede ser utilizado es “+”, pero no realiza la función de suma, sino concatenación de cadenas: TxtResul.Text = TxtNum1.Text + TxtNum2.Text; En la Figura 3 se muestra el resultado del operador + sobre dos tipos de datos string.

Figura 3. Concatenación de cadenas.

Clase Convert: Los problemas anteriores pueden solucionarse por medio de la clase convert, la cual convierte un tipo de datos base en otro tipo de datos base, es decir, puede convertir de string a entero, entero a string, por citar algunos ejemplos. Los tipos base que admite son:

Boolean Char SByte Byte Int16 Int32 Int64

UInt16 UInt32 UInt64 Single Double Decimal DataTime String

Su sintaxis es: Convert. Metodo(parámetro); Para el ejemplo de la Figura 1 se puede hacer lo siguiente:

o Declarar 3 variables de tipo int.

· int num1, num2, result;

o Convertir el valor de TxtNum1.Text a entero y asignarlo a la variable num1. num1=Convert.ToInt16(TxtNum1.Text);

o Convertir el valor de TxtNum2.Text a entero y asignarlo a la variable num2. Num2=Convert.ToInt16(TxtNum2.Text);

o Realizar la multiplicación con las variables numéricas. result=num1*num2;

o Mostrar el resultado de la multiplicación (result) en txtResul.Text. result es de tipo entero y txtResul.Text es string, por lo tanto, es necesario convertir de entero a cadena.

TxtResul.Text = Convert.ToString(result).

Descargar programa.

Tarea 5. Definición de los requisitos del proyecto a realizar en este curso. Instrucciones:Identifica de forma individual, los requisitos e interfaz gráfica del sistema a desarrollar como proyecto del curso.

Busca en tu entorno laboral o social, una problemática que pueda ser resuelta con un Sistema de información.

Con la ayuda del personal relacionado directamente con el problema, identifica los requisitos del sistema (datos que se almacenarán, operaciones a realizar, resultados que se desean obtener). Con la asesoría de tu profesor titular define los módulos del sistema de información.

o Debe existir un módulo de usuarios para el control de acceso al sistema.

Tarea 6. Interfaz gráfica del proyecto a realizar. Instrucciones: Identifica de forma individual, los requisitos e interfaz gráfica del sistema a desarrollar como proyecto del curso.

A partir de los módulos definidos en la tarea 5, crea una interfaz visual en C# que contenga lo siguiente para descargar el ejemplo haz clic aquí

o Un formulario de acceso al sistema que solicite al usuario nombre de usuario y contraseña. o Un Menú que contenga todos los módulos del sistema. o Por cada módulo del sistema debe existir un submenú con las operaciones altas, bajas

modificaciones y consultas. o Por cada submenú debe existir un formulario que contenga los controles necesarios para

introducir o mostrar los datos necesarios.

Tarea 7. Validaciones de los datos introducidos por el usuario. Instrucciones: Valida los datos que el usuario introducirá en el sistema definido en las actividades 5 y 6.

A partir de la interfaz visual generada en la actividad anterior, identifica el tipo de cada dato (entero, caracteres alfabéticos, alfanumérico). Realizar las validaciones necesarias en cada formulario.

Tarea 8. Operaciones aritméticas Isntrucciones: Crea de forma individual, un programa para realizar las operaciones aritméticas básicas (suma, resta, multiplicación, división y residuo de una división).

Lee detalladamente el Tema 3.5 Operaciones aritméticas. Crea un proyecto que contenga un formulario como el que se muestra en la Figura 1.

Figura 1. Operaciones aritméticas.

El usuario introducirá dos números y dependiendo del botón que presione mostrará el resultado de la operación aritmética correspondiente. Realizar las validaciones necesarias en el formulario para que sólo acepte números enteros. Recuerda que el residuo de la división se obtiene con el operador %.

UNIDAD 3 Competencia específica de la unidad: Implementar la herencia en clases derivadas para reutilizar los miembros de una clase base.

Información tomada de wikipedia:

Herencia (informática)

Para otros usos de este término, véase Herencia.

En programación orientada a objetos la herencia es, después de la agregación o composición, el mecanismo más utilizado para alcanzar algunos de los objetivos más preciados en el desarrollo de software como lo son la reutilización y la extensibilidad. A través de ella los diseñadores pueden crear nuevas clases partiendo de una clase o de una jerarquía de clases preexistente (ya comprobadas y verificadas) evitando con ello el rediseño, la modificación y verificación de la parte ya implementada. La herencia facilita la

creación de objetos a partir de otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos) y eventualmente los atributos (variables) de su superclase.

Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables asociadas con la clase texto, son automáticamente heredados por la subclase párrafo.

La herencia es uno de los mecanismos de los lenguajes de programación orientada a objetos basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad. La clase de la que se hereda se suele denominar clase base, clase padre, superclase, clase ancestro (el vocabulario que se utiliza suele depender en gran medida del lenguaje de programación).

En los lenguajes que cuentan con un sistema de tipos fuerte y estrictamente restrictivo con el tipo de datos de las variables, la herencia suele ser un requisito fundamental para poder emplear el Polimorfismo, al igual que un mecanismo que permita decidir en tiempo de ejecución qué método debe invocarse en respuesta a la recepción de un mensaje, conocido como enlace tardío (late binding) o enlace dinámico (dynamic binding).

Ejemplo en Java

import javax.*; import javax.swing.JOptionPane; public class Mamifero{ private int patas; private String nombre; public void imprimirPatas(){ JOptionPane.showMessageDialog(null," Tiene " + patas + " patas\n", "Mamifero", JOptionPane.INFORMATION_MESSAGE); } public Mamifero(String nombre, int patas){ this.nombre = nombre; this.patas = patas; } } public class Perro extends Mamifero { public Perro(String nombre){ super(nombre, 4); } } public class Gato extends Mamifero {

public Gato(String nombre){ super(nombre, 4); } } public class CrearPerro { public static void main(String[] args) { Perro perrito = new Perro("Pantaleon"); perrito.imprimirPatas(); /*Está en la clase mamífero*/ } }

Se declaran las clases mamíferos, gato y perro, haciendo que gato y perro sean unos mamíferos (derivados de esta clase), y se ve como a través de ellos se nombra al animal pero así también se accede a patas dándole el valor por defecto para esa especie.

Es importante destacar tres cosas. La primera, es que la herencia no es un mecanismo esencial en el paradigma de programación orientada a objetos; en la mayoría de los lenguajes orientados a objetos basados en prototipos las clases no existen, en consecuencia tampoco existe la herencia y el polimorfismo se logra por otros medios. La segunda, es que el medio preferido para lograr los objetivos de extensibilidad y reutilización es la agregación o composición. La tercera, es que en lenguajes con un sistema de tipos débiles, el polimorfismo se puede lograr sin utilizar la herencia.

Por otra parte y aunque la herencia no es un concepto indispensable en el paradigma de programación orientada a objetos, es mucho más que un mecanismo de los lenguajes basados en clases, porque implica una forma de razonar sobre cómo diseñar ciertas partes de un programa. Es decir, no sólo es un mecanismo que permite implementar un diseño, sino que establece un marco conceptual que permite razonar sobre cómo crear ese diseño.

Clase Abstracta

La herencia permite que existan clases que nunca serán instanciadas directamente. En el ejemplo anterior, una clase "perro" heredaría los atributos y métodos de la clase "mamífero", así como también "gato", "delfín" o cualquier otra subclase; pero, en ejecución, no habrá ningún objeto "mamífero" que no pertenezca a alguna de las subclases. En ese caso, a una clase así se la conocería como Clase Abstracta. La ausencia de instancias específicas es su única particularidad, para todo lo demás es como cualquier otra clase.

Herencia y ocultación de información

En ciertos lenguajes, el diseñador puede definir qué variables de instancia y métodos de los objetos de una clase son visibles. En C++ y java esto se consigue con las especificaciones

private, protected y public. Sólo las variables y métodos definidos como públicos en un objeto serán visibles por todos los objetos. En otros lenguajes como Smalltalk, todas las variables de instancia son privadas y todos los métodos son públicos.

Dependiendo del lenguaje que se utilice, el diseñador también puede controlar qué miembros de las superclases son visibles en las subclases. En el caso de java y C++ los especificadores de acceso (private, protected, public) de los miembros de la superclase afectan también a la herencia:

Private

Ningún miembro privado de la superclase es visible en la subclase.

Protected

Los miembros protegidos de la superclase son visibles en la subclase, pero no visibles para el exterior.

Public

Los miembros públicos de la superclase siguen siendo públicos en la subclase.

Redefinición de métodos

En la clase derivada se puede redefinir algún método existente en la clase base, con el objeto de proveer una implementación diferente. Para redefinir un método en la subclase, basta con declararlo nuevamente con la misma signatura (nombre y parámetros). Si se invoca un cierto método de un objeto que no está definido en su propia clase, se dispara la búsqueda hacia arriba en la jerarquía a la que dicha clase pertenece. Sin embargo, si existieran dos métodos con la misma signatura, uno en la clase y otro en una superclase, se ejecutaría el de la clase, no el de la superclase.

Cuando se redefine un método en una clase es posible acceder explícitamente al método original de su superclase, mediante una sintaxis específica que depende del lenguaje de programación empleado (en muchos lenguajes se trata de la palabra clave super).

Ventajas

Ayuda a los programadores a ahorrar código y tiempo, ya que la clase padre ha sido implementada y verificada con anterioridad, restando solo referenciar desde la clase derivada a la clase base (que suele ser extends, inherits, subclass u otras palabras clave similares, dependiendo del lenguaje).

Los objetos pueden ser construidos a partir de otros similares. Para ello es necesario que exista una clase base (que incluso puede formar parte de una jerarquía de clases más amplia).

La clase derivada hereda el comportamiento y los atributos de la clase base, y es común que se le añada su propio comportamiento o que modifique lo heredado.

Toda clase pueden servir como clase base para crear otras.

Estereotipos de herencia

Herencia simple

Una clase sólo puede heredar de una clase base y de ninguna otra.

Herencia múltiple

Una clase puede heredar las características de varias clases base, es decir, puede tener varios padres. En este aspecto hay discrepancias entre los diseñadores de lenguajes. Algunos de ellos han preferido no admitir la herencia múltiple debido a que los potenciales conflictos entre métodos y variables con igual nombre, y eventualmente con comportamientos diferentes crea un desajuste cognitivo que va en contra de los principio de la programación orientada a objetos. Por ello, la mayoría de los lenguajes orientados a objetos admite herencia simple. En contraste, algunos pocos lenguajes admiten herencia múltiple, entre ellos: C++, Python, Eiffel, mientras que Smalltalk, Java, Ada y C# sólo permiten herencia simple.

Otra definición de Herencia tomada de kioskea.net:

El concepto de herencia La herencia es específica de la programación orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia (a la que habitualmente se denomina subclases) proviene del hecho de que la subclase (la nueva clase creada) contiene las atributos y métodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y métodos nuevos para la subclase, que luego se aplican a los atributos y métodos heredados. Esta particularidad permite crear una estructura jerárquica de clases cada vez más especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases

que ofrecen una base que puede especializarse a voluntad (la compañía que vende estas clases tiende a proteger las datos miembro usando la encapsulación).

Jerarquía de clase La relación primaria-secundaria entre clases puede representarse desde un punto de vista jerárquico, denominado vista de clases en árbol. La vista en árbol comienza con una clase general llamada superclase (a la que algunas veces se hace referencia como clase primaria, clase padre, clase principal, o clase madre; existen muchas metáforas genealógicas). Las clases derivadas (clase secundaria o subclase) se vuelven cada vez más especializadas a medida que van descendiendo el árbol. Por lo tanto, se suele hacer referencia a la relación que une a una clase secundaria con una clase primaria mediante la frase "es una" x o y.

Herencia múltiple Algunos lenguajes orientados a objetos, como C++ permiten herencias múltiples, lo que significa que una clase puede heredar los atributos de otras dos superclases. Este método puede utilizarse para agrupar atributos y métodos desde varias clases dentro de una sola.

UNIDAD 4 POLIMORFISMO

Competencia específica de la unidad: Implementar interfaces y clases polimórficas.

Información tomada de kioskea.net

Definición de polimorfismo La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se relaciona con los métodos.

En general, hay tres tipos de polimorfismo:

Polimorfismo de sobrecarga Polimorfismo paramétrico (también llamado polimorfismo de plantillas) Polimorfismo de inclusión (también llamado redefinición o subtipado)

Trataremos de describir ahora con más precisión estos tipos de polimorfismo, pero le sugerimos prestar atención, ya que muchas personas suelen confundirse al tratar de comprender las diferencias existentes entre estos tres tipos.

Polimorfismo de sobrecarga El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la función "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.

Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).

Polimorfismo paramétrico El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro.

Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition() efectuando una suma de valores.

El método int addition(int,int) devolvería la suma de dos números enteros. float addition(float, float) devolvería la suma de dos flotantes. char addition(char, char) daría por resultado la suma de dos caracteres definidos por el

autor. etc.

Una signature es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma de método determina qué elemento se va a llamar.

Polimorfismo de subtipado La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).

Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y peón, cada uno heredando el objeto pieza. El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular.

Otra definición de Polimorfismo tomada de wikipedia

En programación orientada a objetos, el polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.

La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice, más allá de las obvias diferencias sintácticas.

Por ejemplo, en un lenguaje de programación que cuenta con un sistema de tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo polimórfico sean parte de una jerarquía de clases.

Descripción En lenguajes basados en clases y con un sistema de tipos de datos fuerte (independientemente de si la verificación se realiza en tiempo de compilación o de ejecución), es posible que el único modo de poder utilizar objetos de manera polimórfica sea que compartan una raíz común, es decir, una jerarquía de clases, ya que esto proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma variable de referencia (que podrá apuntar a objetos de diversas subclases de dicha jerarquía) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de objetos que se tratan de manera polimórfica.

No obstante, algunos lenguajes de programación (Java, C++) permiten que dos objetos de distintas jerarquías de clases respondan a los mismos mensajes, a través de las denominadas interfaces (esta técnica se conoce como composición de objetos). Dos objetos que implementen la misma interfaz podrán ser tratados de forma idéntica, como un mismo tipo de objeto, el tipo definido por la interfaz. Así, distintos objetos podrán intercambiarse en tiempo de ejecución –siempre que sean del mismo tipo–, y además con dependencias mínimas entre ellos. Por estos motivos se considera un buen principio de diseño en programación orientada a objetos el favorecer la composición de objetos frente a la herencia de clases.1

En Java las interfaces se declaran mediante la palabra clave Interface. Estas se utilizan para lograr la necesaria concordancia de tipos que hace posible el polimorfismo, también como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz, y como una forma de documentación para los desarrolladores. A veces, en la literatura específica sobre Java se habla de "herencia y polimorfismo de interfaces", lo que no concuerda con los conceptos de la programación orientada a objetos porque una clase que implementa una interfaz sólo obtiene su tipo de datos y la obligación de implementar sus métodos, no copia comportamiento ni atributos. Esta terminología puede llevar a confusión, puesto que en Java a menudo se utiliza la mal llamada "herencia de interfaces" para dotar a una clase de uno o varios tipos adicionales, lo que unido a la composición, evite la necesidad de la herencia múltiple y favorezca una utilización más amplia del polimorfismo.

No obstante, el uso de una jerarquía de clases como paso previo, es muy habitual incluso en aquellos lenguajes en los que es posible prescindir de tal jerarquía, ya que, desde una perspectiva conceptual, se puede decir que al pertenecer los "objetos polimórficos" a subclases de una misma jerarquía, se asegura la equivalencia semántica de los mensajes que se invocarán de modo polimórfico. Por esto, en programación orientada a objetos a veces se denomina al polimorfismo como "polimorfismo de subclase (o de subtipo)".

En resumen, en la programación orientada a objetos, la esencia del polimorfismo no atañe a la clase o prototipo de la que provienen los objetos. Aun así, en los lenguajes basados en clases, es habitual (y en algunos tal vez sea el único modo) que dichos objetos pertenezcan a subclases pertenecientes a una misma jerarquía. Entonces, el polimorfismo debe verse como una forma flexible de usar un grupo de objetos (como si fueran sólo uno). Podría decirse que el polimorfismo en esencia refiere al comportamiento de los objetos, no a su pertenencia a una jerarquía de clases (o a sus tipos de datos).

Lo anterior se hace aún más evidente en lenguajes de programación orientada a objetos basados en prototipos, como Self, en los que las clases no existen.

Además, es importante remarcar que si un cierto grupo de objetos pueden utilizarse de manera polimórfica es porque, en última instancia, todos ellos saben responder a un cierto mensaje (o a varios), pero dado que esos mismos objetos generalmente contendrán otros métodos (que otros objetos en dicho grupo no contienen), difícilmente se pueda decir lisa y llanamente que los objetos son polimórficos; lo correcto es decir que esos objetos se pueden utilizar de modo polimórfico para un cierto conjunto de mensajes.

Un ejemplo. Podemos crear dos clases distintas: Pez y Ave que heredan de la superclaseAnimal. La clase Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta). Entonces, un tercer objeto puede enviar el mensaje mover a un grupo de objetos Pezy Ave por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover.

El concepto de polimorfismo, desde una perspectiva más general, se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.

Clasificación Se puede clasificar el polimorfismo en dos grandes clases:

Polimorfismo dinámico (o polimorfismo paramétrico) es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.

Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explícitos y declarados uno por uno antes de poder ser utilizados.

El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación genérica.

También se clasifica en herencia por redefinición de métodos abstractos y por método sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros.

Otra clasificación agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores y coerción, Universal (inclusión o controlado por la herencia, paramétrico o genericidad).

Ejemplo de polimorfismo En el siguiente ejemplo hacemos uso del lenguaje C++ para ilustrar el polimorfismo. Se observa a la vez el uso de las funciones virtuales puras, como se les conoce en C++, estas funciones constituyen una interfaz más consistente cuando se trabaja con una jerarquía de clases, puesto que hacen posible el enlace durante la ejecución. Sin embargo como se verá, para que el polimorfismo funcione no es una condición obligatoria que todas las funciones en la clase base sean declaradas como virtuales.

Diagrama de clases UML, que describe gráficamente la relación entre la clase base Figura y sus posibles clases derivadas, y la entidad que utiliza esta estructura: la Aplicación, también identificado como objeto Cliente.

#include<iostream> using namespace std; class Figura { private: float base; float altura; public: void captura(); virtual unsigned float perimetro()=0; virtual unsigned float area()=0; }; class Rectangulo: public Figura { public: void imprime(); unsigned float perimetro(){return 2*(base+altura);} unsigned float area(){return base*altura;} }; class Triangulo: public Figura { public: void muestra(); unsigned float perimetro(){return 2*altura+base} unsigned float area(){return (base*altura)/2;} }; void Figura::captura() { cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISÓSCELES Y UN RECTANGULO:" << endl; cout << "escribe la altura: "; cin >> altura; cout << "escribe la base: "; cin >> base; cout << "EL PERIMETRO ES: " << perimetro(); cout << "EL AREA ES: " << area(); getchar(); return 0; }

Polimorfismo desde una interfaz Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se aplica desde una interfaz puede resultar un poco más oscuro y difícil de entender. Se expone un sencillo ejemplo (en VB-NET) comentado para entender como funciona aplicado desde una interfaz, primero se escribe el código y luego se comenta el funcionamiento. Nota: para no enturbiar el código en exceso, todo lo que no se declara privado se sobreentiende público.

' Declaramos una interfaz llamada IOperar y declaramos una función llamada Operar ' que implementarán las clases deseadas: Interface IOperar Function Operar(valor1 as integer, valor2 as integer) as long End Interface ' Declaramos una clase que trabaja más alejada del usuario y que contendría funciones comunes ' para las siguiente clase, si no fueran idénticas irían en la interfaz, ' pero al caso de mostrar el polimorfismo se suponen idénticas: Class Operacion Function Calcular(clasellamante as Object) as Long ' aquí iría el código común a todas las operaciones.... que llaman a esa función ' por ejemplo recoger los 2 valores de la operación, chequear que están en el rango deseado, etc. ' se supone que la función inputValor recoge un valor de algún sitio valor1 as integer = inputValor() valor2 as integer = inputValor() op as New IOperar = clasellamante Return op.Operar(valor1,valor2) 'AQUÍ es donde se utiliza el polimorfismo. End Function End Class ' Declaramos 2 clases: Sumar y Restar que implementan la interfaz y que llaman a la clase Operacion: Class Sumar Implements IOperar Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar Return valor1 + valor2 End Function Function Calcular() as Long op as New operacion Return op.Calcular(Me) ' se está llamando a la función 'Calcular' de la clase 'Operación' End Function End Class ' segunda clase.... Class Restar Implements IOperar Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar Return valor1 - valor2 End Function Function Calcular() as Long op as New operacion Return op.Calcular(Me) ' se está llamando a la función 'Calcular' de la clase 'Operación'

End Function End Class

Analicemos ahora el código para entender el polimorfismo expuesto en la interfaz: La interfaz expone un método que puede ser implementado por las diferentes clases, normalmente relacionadas entre si. Las clases Sumar y Restar implementan la interfaz pero el método de la interfaz lo declaramos privado para evitar ser accedido libremente y además tienen un método llamado Calcularque llama a la clase Operacion donde tenemos otro método con el mismo nombre. Es esta clase última la que realiza el polimorfismo y debe fijarse como es a través de una instancia de la interfaz que llama al método operar. La interfaz sabe a qué método de qué clase llamar desde el momento que asignamos un valor a la variable OP en el método Calcular de la clase Operacion, que a su vez recibió la referencia del método Calcular desde la clase que la llama, sea ésta cual sea, se identifica a sí misma, mediante la referencia Me ó This según el lenguaje empleado. Debe notarse que la instancia de la interfaz accede a sus métodos aunque en sus clases se hayan declarado privadas.

Diferencias entre polimorfismo y sobrecarga El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos que deseamos añadir una clase Multiplicar), basta con recompilar todo el código que incluye los nuevos tipos añadidos. Si se hubiera recurrido a la sobrecarga durante el diseño exigiría retocar la clase anteriormente creada al añadir la nueva operación Multiplicar, lo que además podría suponer revisar todo el código donde se instancia a la clase.

Un método está sobrecargado si dentro de una clase existen dos o más declaraciones de dicho método con el mismo nombre pero con parámetros distintos, por lo que no hay que confundirlo con polimorfismo.

En definitiva: La sobrecarga se resuelve en tiempo de compilación utilizando los nombres de los métodos y los tipos de sus parámetros; el polimorfismo se resuelve en tiempo de ejecución del programa, esto es, mientras se ejecuta, en función de la clase a la que pertenece el objeto.

UNIDAD 5 EXCEPCIONES Competencia específica de la unidad: Identificar, manejar, gestionar y crear las condiciones de error que interrumpan el flujo normal de ejecución de un programa.

Información tomada de wikipedia:

El manejo de excepciones es una técnica de programación que permite al programador controlar los errores ocasionados durante la ejecución de un programa informático.

Introducción Una excepción en términos de lenguaje de programación es la indicación de un problema que ocurre durante la ejecución de un programa. Sin embargo, la palabra excepción se refiere a que este problema ocurre con poca frecuencia generalmente cuando existe algún dato o instrucción que no se apega al funcionamiento del programa por lo que se produce un error. El manejo de excepciones permite al usuario crear aplicaciones tolerantes a fallas y robustos (resistentes a errores) para controlar estas excepciones y que pueda seguir ejecutando el programa sin verse afectado por el problema. En lenguaje java estas excepciones pueden manejarse con las clases que extienden el paquete Throwable de manera directa o indirecta, pero existen diversos tipos de excepciones y formas para manejarlas.

Uso del manejo de excepciones

El manejo de excepciones ayuda al programador a trasladar el código para manejo de errores de la línea principal de ejecución, además se puede elegir entre manejar todas las excepciones, las de cierto tipo o de las de grupos relacionados, esto hace que la probabilidad de pasar por alto los errores se reduzca y a la vez hace los programas más robustos. Pero es importante utilizar un lenguaje de programación que soporte este manejo, de lo contrario el procesamiento de errores no estará incluido y hará el programa más vulnerable. Este manejo está diseñado para procesar errores que ocurren cuando se ejecuta una instrucción, algunos ejemplos son: desbordamiento aritmético, división entre cero, parámetros inválidos de método y asignación fallida en la memoria. Sin embargo, no está diseñado para procesar problemas con eventos independientes al programa como son pulsar una tecla o clic al mouse.

Las excepciones se dividen en verificadas y no verificadas. Es importante esta división porque el compilador implementa requerimientos de atrapar o declarar para las verificadas lo que hará que se detecten las excepciones automáticamente y de acuerdo al lenguaje de programación utilizado se utilizará un método para corregirlas. Sin embargo para las no verificadas se producirá un error indicando que deben atraparse y declararse. Por eso el programador debe pensar en los problemas que pueden ocurrir cuando se llama a un método y definir excepciones para verificarse cuando sean importantes. Las clases de excepciones pueden derivarse de una superclase común, por lo que con un manejador para atrapar objetos de la superclase, también se pueden atrapar todos los objetos de las

subclases de esa clase. Pero también, se pueden atrapar a cada uno de los tipos de las subclases de manera individual si estas requieren ser procesadas diferente.

A cada célula se le conoce como compiladora de distintos.

Limpieza de pila

En ocasiones cuando se lanza una excepción, pero no se atrapa en un enlace específico, la pila de llamadas se limpia y el programa intenta volverlo a atrapar en el siguiente bloque, esto se conoce como limpia de pila. Este proceso hace que el método en el que no se atrapó la excepción termina, todas sus variables quedan fuera del enlace y el control regresa a la instrucción que originalmente la invocó. La limpieza de pila de repetirá hasta que la excepción pueda ser atrapada porque de lo contrario se producirá un error a la hora de compilar.

Aserciones

Las aserciones ayudan a asegurar la validez del programa al atrapar los errores potenciales e identificar los posibles errores lógicos del desarrollo. Estas pueden escribirse como comentarios para apoyar a la persona que desarrolla el programa. Algunos ejemplos son:

Precondiciones y pos condiciones

Estas características son utilizadas por los programadores para hacer un análisis de lo esperado del programa antes y después de su ejecución. Son importantes porque gracias a ellas se pueden detectar posibles fallas en el programa y corregirlas.

Las precondiciones son verdaderas cuando se invoca a un método, estas describen las características del método y las expectativas que se tienen en el estado actual del programa. Si no se cumplen las precondiciones el comportamiento del método es indefinido por lo que se lanza una excepción que esté preparada o continuar con el programa esperando el error. Las pos condiciones describen las restricciones en el entorno y cualquier efecto secundario del método. Es recomendable escribirlas para saber que esperar en un futuro si es que se hacen modificaciones.

Conclusión

El manejo de excepciones ayuda a lidiar con los errores de una aplicación por medio de la manipulación del código para hacer programas más robustos. Además existen herramientas que ayudan a manejarlas tal es el caso de los bloques try (intentar) que encierran el código que puede lanzar una excepción y los bloques catch (atrapar) que lidian con las excepciones que surjan. También existen técnicas que el programador utiliza para conocer el posible funcionamiento del programa y detectar los errores que pueda contener.

Ejemplos de código Ejemplo de manejo de excepción en Java:

import java.io.IOException; // ... public static void main(String[] args) { try { // Se ejecuta algo que puede producir una excepción } catch (IOException e) { // manejo de una excepción de entrada/salida } catch (Exception e) { // manejo de una excepción cualquiera } finally { // código a ejecutar haya o no excepción } }

Ejemplo de manejo de excepción en Delphi:

procedure TForm1.Button1Click(Sender : TObject); begin try try a := b / c; finally // Este código siempre se ejecuta, independientemente de si ocurre o no una excepción. end; except on e:EZeroDivide do // Manejo de la excepción División por cero. on e:Exception do // Manejo de una excepción "genérica". end; end;

Ejemplo de manejo de excepción en python:

try: result = x / y except ZeroDivisionError: print "division by zero!" else: print "result is", result finally: print "executing finally clause"

Ejemplo de manejo de excepcion en Ada

type T_Matriz is array (Positive range <>, Positive range <>) of Integer; procedure Rellenar_Matriz (Matriz : in T_Matriz; K : in Integer; Q : in Integer); is begin begin Matriz (K,Q) := 3; exception when Constraint_Error => Put_Line ("Las posiciones se salen del rango de la matriz"); end; end Rellenar_Matriz;

Aporte de la liga: http://p-o-o-itsav.blogspot.mx/2012/02/51-definicion-de-excepciones.html

5.1 Definición de excepciones Para descargar el documento de este tema, haz clic aquí

Una excepción es un evento que ocurre durante la ejecución de un programa y detiene el flujo normal de la secuencia de instrucciones de ese programa; en otras palabras, una excepción es una condición anormal que surge en una secuencia de código durante su ejecución. Las excepciones en Java están destinadas, al igual que en el resto de los lenguajes que las soportan, para la detección y corrección de errores. Si hay un error, la aplicación no debería morirse y generar un core (o un crash en caso del DOS). Se debería lanzar (throw) una excepción que a su vez debería capturar (catch) y resolver la situación de error, o poder ser tratada finalmente (finally) por un gestor por defecto u omisión. Java sigue el mismo modelo de excepciones que se utiliza en C++. Utilizadas en forma adecuada, las excepciones aumentan en gran medida la robustez de las aplicaciones.

La gestión de excepciones en Java proporciona un mecanismo excepcionalmente poderoso para controlar programas que tengan muchas características dinámicas durante su ejecución. Las excepciones son formas muy limpias de manejar errores y problemas inesperados en la lógica del programa, y no deberían considerarse como un mecanismo general de ramificaciones o un tipo de sentencias de salto. Los lugares más indicados para utilizar excepciones son aquellos en los que se usan valores como 0 o 1, en C/C++, para indicar algún fallo funcional. Por ejemplo:

#include <sys/errno.h> int fd; fd = open( "leeme.txt" ); if( fd == -1 && errno == EEXIT ) fd = open( "defecto.txt" );

} En este programa C, si falla la primera sentencia open() por cualquiera de las 19 razones distintas de EEXIT por las que puede fallar, entonces el programa se continuaría ejecutando y moriría por alguna razón misteriosa más adelante, dejando atrás un problema de depuración complicado y frustrante.

La versión Java del código anterior, tal como se muestra a continuación:

FilterReader fr; try { Fr = new FilterReader( "leeme.txt" ); } catch( FileNotFoundException e ) { fr = new FilterReader( "defecto.txt" ); } Proporciona una oportunidad para capturar una excepción más genérica y tratar la situación con elegancia o, en el peor de los casos, imprimiría el estado de la pila de memoria. Por ello, que la utilización adecuada de las excepciones proporcionará un refinamiento profesional al código que cualquier usuario futuro de las aplicaciones que salgan de la mano del programador que las utilice agradecerá con toda seguridad.

UNIDAD 6 FLUJOS Y ARCHIVOS

Competencia específica de la unidad: Implementar aplicaciones orientadas a objetos que creen y manipulen archivos para guardar y recuperar información.

Definición de flujos Para descargar el documento de este tema, haz clic aquí

Un Flujo de E/S representa una fuente de entrada y un destino de salida. Un flujo puede representar muchos tipos diferentes de fuentes y destinos, incluyendo archivos de disco, dispositivos, otros programas y arreglos de memoria. Los flujos soportan muchos tipos diferentes de datos, incluyendo bytes simples, tipos primitivos de datos, caracteres localizados, y objetos. Algunos flujos simplementa pasan datos, otros manipulan y transforman datos en formas útiles.

No importa cómo trabajan internamente; todos los flujos presentan el mismo modelo simple a los programas que los usan: un flujo es una secuencia de datos. Un programa usa un flujo de entrada para leer datos desde una fuente, o artículo a la vez:

Leyendo información hacia un programa.

Un programa usa un flujo de salida para escribir datos a su destino, o artículo a la vez:

Escribiendo información desde un programa.

La fuente y el destino de datos retratado arriba puede ser cualquier cosa que mantenga, genere o consuma datos. Obviamente esto incluye archivos en disco, pero una fuente o destino puede también ser otro programa, un dispositivo periférico, un socket de red, o un arreglo.

Clasificación de archivos de texto y binarios

Los archivos de texto plano son aquellos que están compuestos únicamente por texto sin formato, solo caracteres. estos caracteres se pueden codificar de distintos modos dependiendo de la lengua usada. Se les conoce también como archivos de texto llano o texto simple por carecer de información destinada a generar formatos y tipos de letra.

Un archivo binario es una archivo informático que contiene información de cualquier tipo, codificada en forma binaria para el propósito de almacenamiento y procesamiento de ordenadores.

Muchos formatos binarios contienen partes que pueden ser interpretados como texto. Un archivo binario que solo contiene información de tipo textual sin información sobre el formato del mismo, se dice que es un archivo de texto plano. Habitualmente se contraponen los términos archivo binario y archivo de texto de forma que los primeros no contienen solamente texto.

BIBLIOGRAFIA

1. Taylor David. Object Orient informations systems, planning and implementations. Canada: Wiley. 1992. 2. Larman Craig. UML y patrones introducción al análisis y diseño orientado a

objetos. México: Pretince Hall. 1999. 3. Winblad, Ann L. Edwards, Samuel R. Software orientado a objetos. USA: Addison. Wesley/ Díaz Santos. 1993. 4. Fco. Javier Ceballos. Java 2 Curso de Programación. Alfaomega. 5. Agustín Froufe. Java 2 Manual de usuario y tutorial. Alfaomega. 6. Laura Lemay, Rogers Cadenhead. Aprendiendo JAVA 2 en 21 días. Prentice Hall. 7. Herbert Schildt. Fundamentos de Programación en Java 2. McGrawHil. 8. J Deitel y Deitel. Como programar en Java. Prentice Hall. 9. Stephen R. Davis. Aprenda Java Ya. McGrawHill. 10. Kris Jamsa Ph D. ¡Java Ahora!. McGrawHill. 11. Francisco Charte Ojeda. Visual C# .NET. ANAYA MULTIMEDIA 12. Kingsley-Hughes, Kathie; Kingsley-Hughes, Adrian. C# 2005. ANAYAMULTIMEDIA 13. Ceballos Francisco Javier.Enciclopedia de Microsoft Visual C#. 2ª Edición 14. El lenguaje de programación C#.Fco. Javier Ceballos Sierra. Editorial Ra-ma. 15. Tom Archer. A fondo C#. McGRAW-HILL/INTERAMERICANA DE ESPAÑA, S.A.U.