tema: herencia en c#. parte i. - udb el salvador€¦ · tema: herencia en c#. parte i. •...
TRANSCRIPT
1 POO. Guía No. 8
Tema: Herencia en C#. Parte I.
• Computadora con Visual Studio /Visual C#.
• Guía Número 8.
• Dispositivo de almacenamiento o almacenamiento en la nube.
La Herencia.
Es la capacidad de compartir atributos y métodos entre clases.
Es la propiedad que permite definir nuevas clases usando como base clases ya existentes.
La nueva clase (clase derivada) hereda los atributos y comportamiento que son específicos de
la clase existente.
La herencia es una herramienta poderosa que proporciona un marco adecuado para producir
software fiable, comprensible, de bajo costo, adaptable y reutilizable.
La herencia o relación es-un es la relación que existe entre dos clases, en la que una clase
denominada derivada o subclase se crea a partir de otra ya existente, denominada clase
base o superclase.
Evidentemente, la clase base y la clase derivada tienen código y datos comunes, de modo que
si se crea la clase derivada de modo independiente, se duplicaría mucho de lo que ya se ha
escrito para la clase base.
C# soporta el mecanismo de derivación que permite crear clases derivadas, de modo que la
nueva clase hereda todos los datos miembro que pertenecen a la clase ya existente.
Facultad: Ingeniería
Escuela: Computación
Asignatura: Programación
Orientada a Objetos
Materiales y Equipo
Introducción Teórica
POO104. Guía No. 8
2
La declaración de derivación de clases debe incluir el nombre de la clase base de la que se
deriva y el especificador de acceso que indica el tipo de herencia (pública, privada ó protegida).
La primera línea de cada declaración debe incluir la sintaxis siguiente:
class <nombre de clase derivada> : <nombre de clase base>
Tipos de Herencia.
Dependiendo del número de clases y de cómo se relacionen, la herencia puede ser:
a) Simple.
b) Múltiple.
c) De niveles múltiples.
Con independencia del tipo de herencia, una clase derivada no puede acceder a variables y
funciones privadas de su clase base. Para ocultar los detalles de la clase base y de clases y
funciones externas a la jerarquía de clases, una clase base utiliza normalmente elementos
protegidos en lugar de elementos privados.
Herencia Simple.
Cuando sólo se tiene una clase base de la cual hereda la clase derivada, se dice que hay
herencia simple (ver Figura 1.a).
Sin embargo, la herencia simple no excluye la posibilidad de que de una misma clase base se
pueda derivar más de una subclase o clase derivada (Figura 1.b).
(a) (b)
Figura 1. Herencia Simple.
Cuando se necesita representar un concepto general y a partir de éste, conceptos más
específicos, resulta conveniente organizar la información usando herencia.
Clase Base
Clase Derivada
Clase Base
Clase Derivada 1 Clase Derivada 2
POO104. Guía No. 8
3
Esto permite compartir atributos y métodos ya definidos, evita la duplicidad y, por otra parte,
proporciona mayor claridad en la representación que se haga de la información. Es decir, se
logra un mejor diseño de la solución del problema.
Existen numerosos casos en los cuales se da este tipo de relación.
En la Figura 2 se presentan algunos ejemplos de herencia simple.
(a) (b)
Figura 2. Ejemplos de Herencia Simple.
En la figura 2a, la clase Persona es la clase base y Empleado es la clase derivada. Un objeto
de esta clase también es un objeto de la clase “Persona”, por lo tanto, tendrá los atributos y
métodos de ambas clases.
En la figura 2b, la clase Mamífero es la clase base y Vacuno y Equino son las clases
derivadas. En este caso, se dice que todo “Vacuno” y todo “Equino” también son objetos de la
clase “Mamífero” y en consecuencia tendrán todos los atributos y métodos que heredan de la
clase base.
Los miembros protegidos de la clase base podrán ser usados por los métodos de las clases
derivadas, pero no por sus clientes.
Los miembros públicos estarán disponibles para los métodos de las clases derivadas y para
todos sus clientes.
class Base
{ private:
// Miembros declarados en la sección privada: accesibles sólo para miembros de esta clase
protected:
/* Miembros declarados en la sección protegida: accesibles sólo para miembros de esta
clase y de sus derivadas */
public:
// Miembros declarados en la sección pública: accesibles para todos
};
Persona
Empleado
Mamífero
Vacuno Equino
POO104. Guía No. 8
4
Para declarar una clase derivada de una clase previamente definida se utiliza la siguiente
sintaxis:
class Base
{ // Declaración de atributos y métodos de la clase Base
};
// Relación de herencia pública entre las clases Base y Derivada
class Derivada :Base
{ // Declaración de atributos y métodos de la clase Derivada
};
Si se utilizara un constructor con parámetros se debe declarar en la clase “base” y en la
“derivada” sus respectivos constructores. En el constructor de la clase derivada, se especifican
qué parámetros recibe de la base. Esto es gracias a la palabra reservada Base.
Para ello se utiliza la siguiente sintaxis:
public Derivada (parámetros) : base (parámetros propios de la clase Base)
{ // Cuerpo del constructor de la clase Derivada
}
Cuando se declara un objeto del tipo de la clase derivada se invoca al constructor de ésta. De
este constructor lo primero que se ejecuta es la llamada al constructor de la clase base, y
posteriormente se ejecutan sus propias instrucciones.
En cuanto a los parámetros, al invocar al constructor de la clase base se le deben proporcionar
los parámetros que necesita para asignar valores a los atributos propios de la clase base y que
la clase derivada hereda.
En el cuerpo de la clase derivada se harán las asignaciones correspondientes a los atributos
propios de esta clase.
Herencia Múltiple (No aceptada en C#)
La herencia múltiple no es admitida en C#, sin embargo algunos lenguajes de POO sí la
permiten, en el tipo de herencia múltiple se usan dos o más clases base para derivar una
POO104. Guía No. 8
5
clase. Es decir, la clase derivada comparte los atributos y los métodos de más de una clase
(ver Figura 3).
Figura 3. Herencia Múltiple.
Herencia de Niveles Múltiples.
Se presenta cuando una clase derivada se usa como base para definir otra clase derivada. Es
decir, existen diferentes niveles de herencia: en el primero, la clase derivada hereda los
miembros de una clase base, mientras que en el segundo, la clase derivada funciona a su vez
como una clase base y de esta forma comparte con una tercera clase sus propios miembros y
los que heredó (ver Figura 4). Esta relación puede extenderse a tantos niveles como lo
requiera el problema que se esté resolviendo.
Figura 4. Herencia de niveles múltiples.
Este tipo de herencia es muy útil cuando es necesario representar, a partir de conceptos
generales, conceptos más específicos. Cuantos más niveles se deriven, mas especificidad se
definirá.
La figura 5 presenta un ejemplo de herencia de múltiples niveles. El nivel superior representa la
clase más general, la clase “Árbol”. Luego, la clase “Frutal” es una clase derivada de la
primera, lo cual indica que los frutales son una clase más específica de árboles. Por último, se
Clase Base 1 Clase Base 2
Clase Derivada
Clase Base
Clase Derivada 1
Clase Derivada 1.1
Clase derivada de Clase Base. A su vez es la clase base de Clase Derivada 1.1
POO104. Guía No. 8
6
define la clase Cítrico como una subclase de la clase “Frutal”. Esta relación también indica que
los cítricos son una variante, una clase más específica, de los árboles frutales.
Figura 5. Ejemplo de herencia de niveles múltiples.
Herencia en formularios
Los formularios por ser clases dentro de C# pueden utilizarse en herencia, esto permitirá
realizar herencia entre ellos y diseñar aspectos comunes en un formulario padre y luego
heredarlo a sus formularios hijos. La única restricción que debemos recordar es el orden de
ejecución de los constructores.
Un formulario que será padre de otro formulario debe haber ejecutado su constructor
previamente, por lo cual habrá que ejecutar el programa para que su constructor se
ejecute junto con él; de esa manera estará habilitado para ser padre.
Ejemplo 1:
Se muestra un ejemplo más a nivel didáctico de Herencia simple. El objetivo es verificar
que se pueden compartir elementos entre clases y para ello se realiza la implementación
de la jerarquía de clases mostrada en la siguiente figura:
Procedimiento
Bibliografía
Guía 1
Árbol
Frutal
Cítrico
Operación
Sumar Restar Multiplicar
POO104. Guía No. 8
7
Los valores son propiedad de la clase principal y cada clase derivada implementa un método
llamado operar.
Clase OPERACION
Clase Sumar
Clase Restar
POO104. Guía No. 8
8
Clase Multiplicar
Cree un formulario similar al de la imagen
En cada botón de operación crearemos una instancia de la clase correspondiente
POO104. Guía No. 8
9
Ejemplo 2:
El ejemplo anterior nos mostraba de una manera muy sencilla el manejo de herencia; sin
embargo, en el entorno gráfico podría tener mayor utilidad al evitarnos trabajar con diseños de
diferentes formularios de forma separada, podríamos dar la forma deseada a un formulario y
llevar esa programación a otros.
Realizaremos una herencia entre formularios para que compartan formatos, esta herencia
tendrá la siguiente jerarquía.
Realice el Formulario base bajo la apariencia que usted desee, configure color de fondo, tipo
de letra, sin bordes u otros elementos visuales que le gustaría que se reproduzcan en el resto
de formularios.
Agregue un botón de salir. La imagen es únicamente una referencia
Base
Menú
Registro
Docente
Registro
Registro
Estudiante
POO104. Guía No. 8
10
La propiedad Modifiers del botón (y de todos los objetos que desea compartir entre
formularios) debe estar en protected, caso contrario, aunque los demás formularios lo
reciban no podrán manipularlo o personalizarlo.
Programamos el evento click para el botón salir que será utilizado por el resto de formularios.
NOTA IMPORTANTE:
Recuerde que es necesario ejecutar el programa para que el constructor esté habilitado para ser padre
de otro formulario.
Ahora crearemos un formulario plantilla para los registros, puede heredarse de dos formas:
Utilizando formularios heredados directamente, para ello al crear un nuevo formulario seleccionamos
Windows Form y la opción Formulario Heredado o en su versión en inglés Inherited Form
POO104. Guía No. 8
11
Nos mostrará un listado de todos los posibles padres para nuestro formulario (para que los
formularios estén disponibles como padres, sus constructores debieron ser ejecutados
previamente, sino no aparecen en la lista)
Otra forma de realizarlo es escribiendo directamente en el formulario el operador : y el nombre
del formulario del cual deseo heredar
POO104. Guía No. 8
12
Veremos que en el formulario registro recibimos el mismo fondo, tipo de letra y el botón
heredado de la base, ahora trataremos de darle una forma similar a la imagen
Ahora este formato que hemos creado fácilmente se puede heredar a otros formularios,
en nuestro caso el formulario de registro de docentes y estudiantes, así que realizaremos
herencia hacia esos formularios y verá que recibe exactamente el mismo formato que a su
vez puede personalizarse más como en la imagen.
POO104. Guía No. 8
13
Si nota todos aquellos elementos que no le pertenecen directamente al formulario, son
indicados por un cuadro pequeño en la esquina superior izquierda, estos formularios
reciben objetos del formulario registro, el cual a su vez recibió el botón salir del formulario
base.
POO104. Guía No. 8
14
Ahora trabajaremos el formulario menú que heredará directamente de la base y haremos
que pueda llamar a los registros de estudiante y docente.
El menú puede lucir similar a la imagen.
En el menú, programamos los botones para llamar a los formularios de registro de
estudiantes y docentes.
Ahora el único inconveniente es que esos formularios dejan al menú en segundo plano y
el botón de salir solamente cierra el formulario donde se encuentre, pero no detiene la
aplicación por completo, así que en los formularios Registro Docente y Registro
Estudiante programaremos el evento FormClosed
POO104. Guía No. 8
15
Aquí decimos qué queremos que ocurra una vez haya sido cerrado el formulario. En
ambos casos se programará Application.Exit();
Finalmente modificamos Program.cs para que el primer formulario que se ejecute sea el
Menú
En este caso, aunque en nuestra herencia hay 5 formularios involucrados, sólo veremos 3
en pantalla: el menú, el registro docente y el registro de estudiantes.
Ejemplo 3:
Se muestra un ejemplo de Herencia simple en entorno consola. Se realiza la
implementación de la jerarquía de clases mostrada en la siguiente figura:
La cual corresponde a una Papelería que maneja esos dos tipos de Productos, papeles y
utensilios, se reutilizan elementos comunes de la clase principal y se combinan con los
propios de cada clase derivada.
Papeles Utensilios
Producto
POO104. Guía No. 8
16
CLASE PRODUCTO
CLASE PAPELES
POO104. Guía No. 8
17
CLASE UTENSILIOS
CLASE PROGRAM
POO104. Guía No. 8
18
Ejercicio 1:
Basados en el ejercicio 3 en consola, se le pide que lo modifique de forma que funcione en
entorno gráfico, respete los atributos asociados a cada clase y su estructura de herencia.
Ejercicio 2:
Programe la funcionalidad del resto de botones para el formulario de registro de estudiante y
de docente y que puedan llenarse los datagridview que se encuentran en la parte inferior de
los formularios.
Ejercicio 3:
Construya una solución para la jerarquía de clases mostrada en la siguiente figura:
EN ENTORNO GRÁFICO desarrolle:
Para la clase Estudiante, considere los atributos: número de carnet, nivel de estudios.
Para la clase Universitario considerar los atributos: nombre de la universidad, carrera, materias
inscritas, notas, CUM.
Desarrollo de habilidades
Bibliografía
Guía 1
Persona
Empleado
Universitario
Ingeniería
Estudiante
POO104. Guía No. 8
19
Para la clase Ingeniería considerar los atributos: nombre del proyecto, total de horas (duración
de la pasantía), número de horas completadas.
La solución se debe manejar a través de un menú (botones, opciones, combobox u otros) que
permita realizar las siguientes acciones:
a) Crear los objetos de tipo Ingeniería, solicitando los datos al usuario.
b) Verificar que universidad proporciona la mayoría de estudiantes de ingeniería
c) Visualizar el promedio de notas de los estudiantes
d) Salir de la aplicación.
Ejercicio 1:
Considere la siguiente jerarquía de herencias del transporte disponible que tiene una
Compañía turística:
Definir las clases. Decidir que atributos y métodos incluir en cada clase de tal manera que su
programa pueda realizar como mínimo las siguientes acciones:
a) Crear objetos de cualquier tipo de las clases finales (carro, helicóptero, crucero),
solicitando los datos al usuario.
b) Verificar qué opciones de transporte terrestre se tienen para la realización de un viaje
de fin de semana.
c) Reservar un vehículo y si estuviera ocupado, enviarme un mensaje de que no está
disponible.
d) Salir de la aplicación.
Investigación Complementaria
Guía 3
Guía 4
fía Vehiculo
Terrestre Aéreo
Carro
Marítimo
Helicóptero Lancha