C# Ejercicios
C# Ejercicios
EJERCICIOS
ESTHER FERREIRO
1..NET
1) Explica qu significa que .NET sea multilenguaje.
2) Si tenemos un fichero .exe producto de la compilacin de un fichero fuente escrito
en C# podemos ejecutar ese fichero en Windows XP? Explica la respuesta.
3) En que se diferencia y en que se parece un ensamblado a una DLL.
4) Explcame para que se utiliza:
a. ASP.NET
b. Windows Forms
5) Qu es el CLR? Indica tres de sus caractersticas.
6) Qu funcin tiene el JIT? Indica cules son sus entradas y cuales sus salidas.
7) En la plataforma .NET: es necesario eliminar los objetos cuando stos ya no son
necesarios?
8) Dnde se almacenan los metadatos? En que consisten?
9) Qu es necesario para instalar una aplicacin en C#?
10) Qu reglas tienen que cumplir los ficheros escritos en distintos lenguajes de la
plataforma .NET para poder colaborar?
11) De qu clase hereda, en ltimo trmino, todos los datos?
12) Qu es la BCL?
13) Cmo se denominan las libreras en .NET?
14) Todas las libreras de .NET se engloban dentro del espacio de nombres..
15) Indica el namespace que contiene las herramientas para trabajar con
a. ADO.NET
b. Colecciones de datos
c. Aplicaciones Windows
d. Interfaces para aplicaciones Web
e. Datos en formato XML
2. INTRODUCCIN A C#
PRCTICA DEPURACIN (I)
Dado el programa siguiente:
static void Main(string[ ] args)
{
string miNombre;
Console.WriteLine("Por favor, escriba su nombre");
miNombre = Console.ReadLine( );
Console.WriteLine("Hola {0}", miNombre);
}
Puntos de interrupcin
1. Pulse en el margen izquierdo sobre la lnea en que aparece por primera vez
Console.WriteLine en la el mtodo Main.
En el margen aparecer un punto de interrupcin (u punto grande y rojo).
2. En el men Debug, seleccione Start (o pulse F5).
Al iniciarse la ejecucin del programa, se abrir una ventana de consola y luego el
programa se detendr en el punto de interrupcin.
PROCEDIMIENTO
Para empezar a depurar el Kit de Bienvenida de Visual C#, haremos lo siguiente:
1. Iniciar Visual C# Express.
2. En el men File, hacer clic en New, y a continuacin hacer clic en Project.
3. Seleccionar el tipo de aplicacin haciendo clic en Kit de Salvapantallas..
4. En el men Debug, hacer clic en Step Into. En lugar de ejecutarse normalmente,
el cdigo se detiene en la primera lnea de cdigo.
Esto es lo que hace Step Into: nos permite desplazarnos por el cdigo lnea a
lnea. Cuando se interrumpe la ejecucin de nuestro cdigo, se encuentra en un
estado de interrupcin. Si la prxima sentencia es una llamada a funcin, el
depurador saltar hacia ella.
5. Observemos la lnea de cdigo resaltada. En el margen izquierdo, podemos ver
una flecha amarilla. Esto nos muestra la prxima sentencia que se ejecutar,
tambin denominada punto de ejecucin.
6. Ahora, observemos la ventana Locals.
Si no est visible, podemos abrirla en el men Debug-Windows-Locals.
La ventana Locals muestra las variables locales para la funcin actual. Vemos
que hay una entrada en la lista: arg. Observemos cmo la ventana Locals nos
muestra el valor y el tipo de la variable.
7. En la parte inferior de la ventana Locals hay una ficha denominada Watch.
Observar que la ventana Watch no tiene ninguna entrada. Mientras que el
depurador rellena la ventana Locals automticamente, la ventana Watch es un
lugar dnde podemos aadir nuestras propias entradas.
8. Hacer clic en la primera fila de la ventana Watch bajo el encabezado Name, y
escribir:
args.
Tras escribir el punto, aparece una lista con todos los miembros de args.
9. Hacer clic en el miembro Length y ahora args.Length aparece en la columna
Name. Ahora podemos visualizar el valor y el tipo del tamao del array.
10. Hacer clic en la siguiente fila de la columna Name y aadir args.IsReadOnly a
la ventana Watch.
11. Desplazarse una fila hacia abajo en la columna Name y hacer clic de nuevo.
Esta vez, escribir args.Length+20, y presionar Enter.
Como podemos ver, Name puede contener expresiones, as como nombres de
variables.
12. Ahora, podemos mover el puntero del ratn hacia atrs hasta la ventana de
cdigo fuente Program.cs. Ubicar el cursor del ratn directamente sobre
args.Length en la lnea resaltada, y mantenerla all durante un instante.
Casi inmediatamente, veremos un pequeo cuadro que muestra el nombre y el
valor de la variable. Este cuadro se denomina sugerencia de datos, o DataTip.
Los DataTips son un modo rpido y fcil de obtener informacin sobre nuestro
cdigo. Utilizar un DataTip es ms rpido que aadir una entrada a la ventana
Watch, pero la ventana Watch nos permite mantener una lista de variables y
expresiones a la que nos podemos referir ms adelante.
13. En el men Debug, hacer clic en Step Into de nuevo, o presionar la techa F11.
Observar que la siguiente sentencia ha cambiado. Como args.Length es igual a
cero, la prueba if ha fallado y la ejecucin prosigue hacia abajo hasta la clusula
else.
Evaluar los pasos siguientes para averiguar qu habra pasado si la prueba
(args.Length > 0) hubiese funcionado.
14. Desplazarse hacia arriba hasta encontrar la primera lnea de cdigo tras
if (args.Length > 0)
Su aspecto es similar al siguiente:
string arg = args [0].ToLower(CultureInfo.InvariantCulture).Trim
15. Hacer clic con el botn secundario sobre esa lnea de cdigo y hacer clic en Set
Next Statement que aparece en el men contextual.
Observar que la sentencia sobre la que hemos hecho clic se ha convertido en la
prxima sentencia.
16. Hacer clic en Step Into, o presionar F11 una vez ms.
Algo no est bien. Aparece un cuadro de dilogo, indicndonos que hemos
obtenido una excepcin IndexOutOfRange.
Este cuadro se denomina Asistente de Excepciones. Observemos la informacin
que nos muestra. Nos indica que la excepcin se ha producido porque un ndice
estaba fuera de los lmites de la matriz y no se ha capturado la excepcin; dicho
de otro modo, que no ha sido capturada y corregida por un procesador de
excepciones.
El comando Set Next Statement es muy potente como herramienta para la
depuracin, por lo que debe ser utilizado con mucho cuidado.
Ahora podemos arreglar este desorden, siguiendo los prximos pasos.
17. Hacer clic en la casilla de cierre para eliminar el Asistente de Excepciones.
18. Desplazarse de nuevo hacia abajo a la clusula else, hacer clic con el botn
secundario en la llamada a ShowScreenSaver, y elegir Set Next Statement.
La llamada a ShowScreenSaver se resalta de nuevo como la siguiente sentencia.
19. Hacer clic en Step Into, o presionar F11.
La siguiente sentencia cambia de nuevo. Hemos pasado de Main a la funcin
static void ShowScreenSaver.
Observar la ventana Watch. Las variables y la expresin que introdujimos estn
en gris y aparece un signo de exclamacin. Esto indica que uno de los valores
que queremos examinar no estn actualizados. En este caso, se debe a que
hemos introducido una nueva funcin y las variables estn fuera del rango.
20. Observar la siguiente lnea de cdigo, que crea un nuevo objeto
ScreenSaverForm.
ScreenSaverFrom screenSaver = new ScreenSaverForm();
21. Seleccionar Step Into, o presionar F11.
Nos encontramos ahora en el constructor de ScreenSaverForm.
No queremos depurar este constructor, por lo que salimos de aqu.
22. Desde el men Debug, hacer clic en Step Out.
Nos encontramos de nuevo en la funcin ShowScreenSaver.
Podamos haber evitado acceder a la llamada seleccionando Step Over en lugar
de Step Into.
Como podemos ver, nos hemos detenido varias veces. No es necesario depurar
un largo programa lnea por lnea. Utilizaremos otra caracterstica ms del
depurador: los puntos de interrupcin.
23. Hacer clic con el botn secundario sobre la siguiente lnea de cdigo.
24. Desde el men de acceso directo, seleccionar Breakpoint y hacer clic en Insert
Breakpoint.
Aparece al margen un punto rojo que representa un glifo de punto de
interrupcin. Si hicisemos clic con el botn secundario en el glifo del punto de
interrupcin, podramos eliminar o deshabilitarlo. Sin embargo, no lo haremos.
25. En el men Debug, hacer clic en Stop Debugging.
De esta forma, finalizar la sesin de depuracin. A continuacin, empezaremos
una nueva.
26. En el men Debug, hacer clic en Start.
Observar cmo la aplicacin se inicia y se ejecuta hasta llegar al punto de
interrupcin que hemos establecido. Los puntos de interrupcin son a la
depuracin lo que los marcadores son a la lectura. Podemos establecer un punto
de interrupcin en el lugar de nuestra aplicacin que queramos interrumpir.
Podemos establecer tantos puntos de interrupcin como queramos.
27. En el men Debug, hacer clic en Continue.
Se ejecuta el salva pantallas. Seleccionar Continue durante una sesin de
depuracin es similar a seleccionar Start para empezar una sesin de
depuracin.
El salva pantallas debera finalizar su ejecucin por s mismo. Si no lo hace, en el men
Debug, hacer clic en Break All, o escribir Ctrl+Alt+Break, y a continuacin hacer clic
en Stop Debugging.
EJERCICIOS
1. Explica tres caractersticas de C# de forma sencilla y con tus palabras.
2. Explica la diferencia entre un namespace y una clase.
3. Cul es la clase imprescindible en todo programa escrito en C#? Explica lo que
consideres su caracterstica principal.
4. Qu son los caracteres UNICODE? En qu se diferencia del ASCII? Si no lo
sabes bscalo en Internet y escribe sus caractersticas.
5. Dada la siguiente definicin de clase
class caballo
string color;
string raza;
void AsignarNombre (string n)
{
string nombre=n;
}
Para convertir un entero a un cardinal del enumerado se debe utilizar un cast del
tipo enum.
tipoEnum tipo=(tipoEnum)0;
4) Realizar un ejercicio similar al 3) pero utilizando para ello los tipos adecuados para
almacenar de cada libro
a. ISBN
b. precio
c. tipo de libro: histrico, viajes, policaco.
5) Implementa un programa que pida dos nmeros reales por pantalla, los sume y
muestre el resultado por pantalla. Uno de los nmeros debe ser double y el otro
nmero y el resultado float.
6) Implementa un programa que pida dos nmeros enteros por pantalla y almacene el
resultado en un nmero de tipo float.
7) Implementa un programa que pida dos nmeros reales por pantalla y almacene el
resultado en un nmero entero.
8) Ejecuta el programa ejemplo del apartado Checked/Unchecked. Realiza las
modificaciones sugeridas en los apuntes.
4. INSTRUCCIONES Y EXCEPCIONES
1) Conversin de un da del ao en un par de mes y da. En este ejercicio se
implementar un programa que lea de la consola un nmero entero de da (entre 1 y
365) y lo almacene en una variable entera. El programa convertir este nmero en un
mes y un da del mes e imprimir el resultado en la consola. Por ejemplo, el resultado de
introducir 40 debe ser Febrero 9. (En este ejercicio se ignora el efecto de los aos
bisiestos.)
Realizar una mejora al programa permitiendo realizar la operacin mltiples veces hasta
que se introduce el 0.
Realizar una mejora creando una excepcin propia que lance un error en el caso de que
el da no est en el rango correcto (1:365).
2) Escribir dos versiones (una usando for y otra usando while) de un programa que
imprima una escala de temperatura de -30C a +45C, en la que varen de 5 en 5
C.
3) Escribir un programa que imprima las tablas de multiplicar del nmero 1 al 10.
Cada tabla debe ir separada por una lnea en blanco.
4) Escribir un programa que genere, de modo aleatorio, 10 nmeros entre 1 y 100.
Nota:
Para crear un nmero aleatorio se debe crear un objeto de System.Random
System.Random aleatorio= new System.Random();
y despus ya podemos llamarlo de la siguiente manera:
int num=aleatorio.Next();
El mtodo Next() est sobrecargado y puede ser:
Next()-> genera un nmero entero aleatorio
Next(int maxValor)->genera un nmero aleatorio entre 1 y maxValor
Next(int minValor, int maxValor)->genera un nmero aleatorio entre minValor
(incluido) y maxValor.
5) Escribir un programa genere nmeros aleatorios (entre 1 y 100) y verifique si son
pares o impares, mostrando el resultado en la pantalla.
Nota:
Recordar que el operador % nos muestra el resto de dos nmeros enteros
6) Escribir un programa que genere aleatoriamente un nmero como nota de un
alumno, y muestre su calificacin segn la siguiente tabla: (fijar un rango entre 0 y
150)
De 0 a 50 puntos -> Suspenso
De 51 a 75 puntos -> Recuperar
De 76 a 90 puntos -> Aprobado
De 91 a 100 puntos -> Aprobado con mrito
Menor que 0 o mayor que 100 -> puntuacin invlida.
12
5. MTODOS Y PARMETROS
1)
Crear un programa que indique si dos nmeros son iguales y, en caso contrario,
cual es el mayor. Desde Main se introducirn los nmeros y una funcin devolver
el resultado a Main que lo mostrar por pantalla.
2)
Modificar el programa para que la entrada de valores por teclado y la salida sea
realizada tambin por una funcin. Poner todos los mtodos en una clase distinta a
la clase donde est Main().
3)
Hacer un programa que calcule el factorial. Se debe incluir una funcin que
reciba un valor int y calcule el factorial, que ser devuelto a Main. No usar
recursividad.
a) Controlar los posibles errores de introducir un valor errneo y de
desbordamiento
4)
Crear un programa que cree una estructura con los datos de una persona:
nombre, edad, nivel de estudios, curso. Hacer un programa que pida todos los datos
por pantalla, excepto el curso que se calcular en funcin del nivel de estudios.
Despus se debe mostrar toda la informacin de la estructura por pantalla.
El nivel de estudios debe ser un enumerado con al menos tres niveles.
Los cursos a realizar deben ser otro enumerado, uno para cada nivel de estudios
Cada nivel de estudios tendr asignado un curso.
Debe haber mtodos para:
a. Introducir los datos por teclado
b. Asignar los cursos
c. Mostrar toda la informacin por pantalla
5)
6)
Hacer un mtodo esttico que sume dos nmeros que se pasan por parmetros:
uno debe ser int y otro float, el mtodo devolver el resultado a la funcin principal.
Sobrecargar el mtodo intercambiando los parmetros. Probar su funcionamiento
con diversos datos de llamada.
7)
STRING
1. Implementar un mtodo que tome como parmetro un string y lo devuelva invertido
2. Hacer un programa que valide un email, las reglas son las siguientes:
a. Eliminar posibles espacios al principio y al final.
b. Que todos los caracteres sean vlidos (hacer una cadena con todos los
caracteres vlidos y comprobar que todos los caracteres del email estn
incluidos dentro de ella). Slo permite letras, dgitos, y los smbolos _ - @ y
el punto.
c. Que tenga un smbolo @, ni ms ni menos.
d. Que tengan al menos un punto a la derecha de @, pero puede ser ms de uno
e. Que el lado izquierdo sea ms largo que 0
Suponemos que Main() est definido en una clase llamada Program y debemos crear
otra clase llamada Email donde implementaremos el mtodo Validar.
3. Manejar un diccionario incluyendo bsqueda de palabras.
a. Crear una clase llamada Enciclopedia que contenga:
b. Crear una clase llamada Program que contenga el mtodo Main() desde
donde se realizarn las operaciones que permitan al usuario introducir una
palabra, buscarla en la enciclopedia y mostrarla por pantalla. El usuario puede
introducir la palabra en maysculas o minsculas, adems pueden tener
espacios en blanco al principio o al final.
4. Implementacin de Find-Replace de los Editores de Texto
Entre las funcionalidades que ofrecen los editores de texto hoy en da se encuentra la
bsqueda y reemplazo de una palabra por otra, todas las veces que sta aparezca en el
texto.
Hacer un programa que implemente la bsqueda y reemplazo utilizando las funciones y
conceptos de string, con las siguientes condiciones:
El contenido del texto se almacena en la clase Texto como un string.
Se incluye el mtodo BuscarReemplazar(str1,str2) donde el primer parmetro
(str1) es el string a buscar y el segundo (str2) es el string por el cual reemplazar
el string encontrado.
En la bsqueda se consideran idnticas las maysculas de las minsculas, es
decir, "CASA" es totalmente equivalente a "Casa".
16
Nota:
string Remove(int posicin, int nmero) :
17
7. CONCEPTOS DE LA POO.
EJERCICIOS
1. Crear una clase llamada CGgrados que contenga: public float gradoC
Crear otra clase llamada Program que contenga:
a) Una instruccin que cree un objeto de tipo CGgrados en Main()
b) Un mtodo esttico llamado PasarGrados al que se le pasa por parmetro
un objeto DGgrados y un valor para asignar al campo gradoC.
c) Un mtodo esttico llamado SacarGrados que muestre los grados del objeto
d) Llamadas a los mtodos desde Main().
e) Ejecutar el programa paso a paso y fijarse en las variables locales
f) Convertir el dato gradoC en private. Ejecutar y analizar los errores. Poner
como comentario los mtodos creados en b) y c) y las llamadas en d).
g) Crear un mtodo esttico en CGgrados llamado
PasarGrados (Cggrados, float) que de valor al campo privado.
h) Crear un mtodo esttico en CGgrados llamado SacarGrados (Cggrados)
que muestre los grados por pantalla.
i) Introducir las llamadas correctas a estos mtodos en Main()
j) Ejecutar el programa paso a paso y fijarse en las variables locales en cada
mtodo en el que se entra.
k) Modificar la clase CGgrados y eliminar el modificador static de todos los
mtodos y dejarlos pblicos. Compilar y ver que errores hay pues los
mtodos no pueden ser llamados como hasta ahora.
l) Modificar las llamadas a los mtodos para que funcionen correctamente.
m) Eliminar al objeto del paso por parmetros en los mtodos y utilizar this en
su lugar
FIJARSE EN QUE HAN QUEDADO LOS DATOS PRIVADOS Y LOS MTODOS PBLICOS
Toda estructura siempre tiene definido un constructor sin parmetros que lo que hace es
darle en esos casos un valor por defecto a los objetos declarados. Ese valor consiste en
poner a cero toda la memoria ocupada por el objeto, lo que tiene el efecto de dar como
valor a cada campo el cero de su tipo.
Por ello se puede construir un tipo struct utilizando new
Ejemplo:
struct Punto{ int x; int y}
.
Punto p = new Punto();
Console.WriteLine(p.X);
Imprime un 0 por pantalla ya que utilizando new todos los campos se inicializan a su
valor por defecto.
NuevaCuentaBancaria() es un mtodo que pide por pantalla los datos del
struct y los devuelve con return. Crear el struct utilizando new.
Escribe() es un mtodo que toma una variable CuentaBancaria y la muestra
por pantalla.
Compilar el programa hasta que no exista ningn error
3) Modificar CuentaBancaria para que en lugar de un struct sea una clase. Es
necesario realizar alguna modificacin en el programa para que funcione?. Compilar y
comprobar que todo funciona correctamente. Explicar en el papel que es lo que ha
cambiado internamente al cambiar el tipo de struct a class.
4) El objetivo es encapsular la clase CuentaBancaria para ello se deben definir los
campos como privados. Compilar y analizar dnde y por qu da errores (no solucionar,
por ahora) Explicar en el papel cuales son los problemas.
5) Para acceder a los datos privados de una clase debemos implementar un mtodo
pblico no esttico llamado Popular(). Este mtodo devolver void y recibir dos
parmetros: un entero largo (el nmero de cuenta bancaria), un decimal (el saldo de la
cuenta bancaria) y un entero que se asignar de la manera adecuada a tipoCuenta. Es
importante que a los parmetros del mtodo se les llame como a los campos (qu
tenemos que utilizar para diferenciar los campos de los parmetros?).
Nota: Recordar que se aconseja poner primero elementos pblicos y despus privados
Realizar las modificaciones adecuadas en el mtodo NuevaCuentaBancaria() para que
no de errores en este mtodo (los seguir dando en Escribir()).
6) Ya hemos solucionado la forma de asignar valores al objeto pero tenemos que
resolver como acceder a los campos privados para mostrar sus datos en el mtodo
Escribir(). Para ello debemos crear un mtodo pblico por cada campo que devuelva
el campo en cuestin en la clase CuentaBancaria y llamarlos desde Escribir().
a) crear Numero() que devuelva el campo numCuenta
b) crear Saldo() que devuelva el campo saldoCuenta
c) crear Tipo() que devuelva el campo tipoCuenta
20
21
22
8. CREACIN DE OBJETOS
EJERCICIOS
1. En la prctica CuentaBancaria creada en prcticas anteriores se deben eliminar los
mtodos que asignan valores a las variables de instancia para el saldo y el tipo de
cuenta y los sustituir por los siguientes constructores:
a. El primero debe inicializar el saldo a 0 y el tipo de cuenta Ahorro. Adems
deber asignar un nmero de cuenta por medio del mtodo creado para ello
b. El segundo ser igual que el anterior pero recibir un decimal que asignar
al saldo.
c. El tercero ser igual que el anterior pero recibir adems el tipo de cuenta.
Probar los distintos constructores.
2. En la prctica anterior sustituir los mtodos que acceden a los campos privados por
propiedades que realicen la misma operacin. Cambiar aquello que sea necesario
para que el programa llame correctamente a estas propiedades.
Aadir funcionalidad para que se pueda cambiar el tipo de cuenta utilizando
propiedades y llamadas desde Main();
3. Se trata de construir un programa que simule una maquina de venta de tabaco.
El programa en funcionamiento tendra el siguiente aspecto:
Creacin de Objetos.Ejercicios
24
clase Entrada a partir de la cual se crearn los objetos que contiene una agenda
clase Program donde residir Main() y todas las llamadas a los mtodos
Utilizar constructores y propiedades.
Utilizar un campo de solo lectura que almacene un nombre de agenda (privado,
trabajo, familia, etc)
Permitir introducir entradas, mostrar todas las entradas, modificar y buscar una
entrada.
Creacin de Objetos.Ejercicios
25
9. HERENCIA. EJERCICIOS
1) Implementar la siguiente jerarqua en la cual hay dos interfaces: IMedidaInglesa,
IMedidaMetrica y una clase llamada Caja que implementa las interfaces.
IMedidaInglesa
IMedidaMetrica
+ float Largo_I()
+ float Ancho_I()
+ float Largo_M()
+ float Ancho_M()
Caja
- float largoPulgadas
- float anchoPulgadas
+ Caja (float,float)
El constructor de Caja debe dar valor a los atributos privados.
La implementacin de Largo_I() y Ancho_I() debe devolver el valor los atributos
privados respectivos.
La implementacin de Largo_M() y Ancho_M() debe devolver el valor los atributos
privados respectivos multiplicados por 2.54.
Desde Main() Crear un objeto caja1 al que se le pasarn dos valores en su constructor y
luego mostrar los valores de retorno de todos los mtodos implementados en Caja (con
el texto adecuado: mtrico o pulgadas);
2) Modificar la jerarqua de tal manera que la clase Caja sea abstracta, en la que los
mtodos de la interfaz estn implementados como mtodos abstractos (sin cuerpo) y los
atributos se definan como protected. Aadir a la jerarqua una clase llamada Cajn que
hereda de Caja y que ser la que contendr los cuerpos de los mtodos implementados.
Notar que no permite poner el nombre de la interfaz delante del nombre del mtodo a
implementar, por lo que los mtodos deben tener distinto nombre (poner como en el
ejercicio 1).
Herencia.Ejercicios
26
3)
Producto
+ Producto()
+ MCodigo()
+ MDescripcion()
+ MPrecio()
Libro
+ Libro()
+ MAutor()
+ MISBN
CompactDisc
+ CompactDisc()
+ MArtista()
+ MDiscografica()
Una tienda que vende libros y CDs pretende catalogar sus productos indicando su
cdigo, descripcin, precio, autor, artista, nmero ISBN y discogrfica. Usando el
concepto de generalizacin podemos crear una clase base Producto, que deber
presentar cdigo, descripcin y precio. La clase derivada Libro deber presentar
autor e ISBN. La clase derivada CompactDisc deber presentar el artista y la
discogrfica.
Vamos a implementar el cdigo que permita crear este sistema:
public class Producto
{
//Constructor
public Producto (int codigo, double precio, string descripcion)
{
Codigo = codigo;
Precio = precio;
Descripcion = descripcion;
}
//Mtodos y propiedades
public int MCodigo
{
get { return Codigo; }
set { Codigo = value; }
}
public double MPrecio
{
get { return Precio; }
set { Precio = value; }
}
public string MDescripcion
{
get { return Descripcion; }
Herencia.Ejercicios
27
Herencia.Ejercicios
28
REDEFINICIN DE MTODOS
Vamos a utilizar las posibilidades de conversin de los objetos de hijos a padres.
Estas operaciones estn dentro de la idea de polimorfismo de las referencias. Las
referencias polimrficas se definen cuando creamos un objeto, o utilizamos como
parmetro la referencia de un objeto, que haya sido construido a partir de una
referencia de su clase base.
En este ejemplo vamos a crear un mtodo que cree un catlogo de productos, e
incluir tanto libros como DVDs.
Vemos primero la definicin de la clase catlogo
public class Catalogo
{
public void AnadeProducto (Producto producto)
{
catalogo.Add (producto);
}
public void VerCatalogo()
{
foreach (Producto arg in catalogo)
{
Console.WriteLine(arg.MCodigo+"-"+arg.MDescripcion);
if (arg is Libro) Console.WriteLine("libro");
else Console.WriteLine("CD");
Console.ReadKey();
}
}
private ArrayList catalogo = new ArrayList();
}
Las llamadas a esta clase seran de la siguiente forma (fijarse en los tipos de los
parmetros)
class Program
{
static void Main(string[] args)
{
Producto producto1 = new Libro(1, 55.0, "Aprendiendo C#", "Ana
Garca", "1212212");
Producto producto2 = new CompactDisc(2,5.0,"portugal-flamenco",
"Sueos ibricos", "Rao Kiao");
Catalogo catalogo = new Catalogo();
catalogo.AnadeProducto(producto1);
catalogo.AnadeProducto(producto2);
catalogo.VerCatalogo();
}
}
29
Que podra se llamado desde Main() y nos mostrara la descripcin del producto ya sea
libro o CD.
Console.WriteLine(producto2.ToString());
Tambin podemos redefinir Equals(). Este mtodo se utiliza para comparar el objeto
sobre el que se aplica con cualquier otro que se le pase como parmetro. Devuelve true
si ambos parmetros son iguales y false en caso contrario
public virtual bool Equals (object o)
La implementacin que por defecto se ha dado a este mtodo consiste en usar igualdad
por referencia para los tipos por referencia e igualdad por valor para los tipos por valor.
Es decir, si los objetos a comparar son de tipos por referencia slo se devuelve true si
ambos objetos apuntan a la misma referencia en memoria dinmica, y si los tipos a
comparar son tipos por valor slo se devuelve true si todos los bits de ambos objetos
son iguales, aunque se almacenen en posiciones diferentes de memoria.
Hay que tener en cuenta que es conveniente que toda redefinicin del mtodo Equals()
que hagamos cumpla con una serie de propiedades que muchos de los mtodos
incluidos en las distintas clases de la BCL esperan que se cumplan. Estas propiedades
son:
-
Herencia.Ejercicios
30
CLASES SELLADAS
Las clases selladas no pueden derivar, o sea, ninguna clase puede heredar de ellas.
En el ejemplo podemos fijar como clases selladas Libro y CDDs en el caso de que esto
sea as
public sealed class CompactDisc : Producto
public sealed class Libro : Producto
CLASES ABSTRACTAS
De la misma forma que delimitamos las ramas finales de una jerarqua de clases,
debemos especificar cuales son las clases bases ms generales del modelo, para
garantizar que ese conjunto de clases se defina bien en los procesos de generalizacin y
especializacin.
Las clases muy genricas generalmente no tienen objetos asociados. En el caso del
modelo del ejemplo, no se venden productos poro si libros y CDs. Por tanto tendra ms
sentido marcar la clase Producto como abstracta, haciendo que no se pudiesen generar
objetos a partir de ella.
Una clase abstracta puede contener mtodos con comportamiento bien definido y/o
mtodos abstractos, que sirvan solamente como concepto para un determinado
comportamiento.
Cuando una clase derivada especializa una clase abstracta, est obligada a reescribir
todos los mtodos abstractos de la clase base, para garantizar que tengan una
implementacin correcta.
En el caso de la tienda de CDs y libros, podemos definir la clase Producto como
abstracta e incluir en ella el mtodo abstracto getDescripcionCompleta(), haciendo que
sus subclases reescriban ese mtodo y estipulen una implementacin especfica para
cada tipo de producto.
Definicin de la propiedad del mtodo
public abstract string getDescripcionCompleta();
Herencia.Ejercicios
31
A continuacin debemos hacer que las clases Libro y CDs implementen esta interfaz
En la clase Libro
public double getValorVenta(){
return MPrecio * 1.2;
}
En la clase CompactDisc
public double getValorVenta(){
return MPrecio * 1.1;
}
Las interfaces definen tipos, stos se pueden usar como referencia de objetos. As,
podemos utilizar el tipo de una interfaz como parmetro de mtodos o constructores, sin
utilizar el concepto de polimorfismo. Por medio de ese mecanismo, podemos incluir, en
el modelo de nuestra tienda de libros y DCs, un sistema de carrito de compras, que
almacene los productos vendibles y calcule el valor de las compras a partir del precio de
venta.
class Carrito {
public Carrito()
{
vendibles = new IVendible[10];
counter = 0;
}
public IVendible[] Pvendibles
{
get{ return vendibles; }
}
public int AdicionaVendible (IVendible vendible)
{
vendibles[counter++] = vendible;
return counter;
}
public IVendible getVendible(int index)
{
return vendibles[index];
}
public double CalculoCompras()
{
double valor = 0;
for (int i=0;i<counter;i++){
valor+=vendibles[i].getValorVenta();
}
return valor;
Herencia.Ejercicios
32
Vamos a ver como se utilizara este carrito. Fijarse en el tipo del valor que se le da al
parmetro. Recordar que entre una clase derivada y una clase base siempre hay
conversin implcita.
Carrito carrito = new Carrito();
carrito.AdicionaVendible(producto1);
carrito.AdicionaVendible(producto2);
Console.WriteLine("Valor de las compras " + carrito.calculoCompras());
Cuando ejecuto estas instrucciones desde Main() me da problemas pues las instancias
producto1 y producto2 son de tipo Producto que no implementa IVendible.
Para solucionar esto puede haber dos soluciones, o bien realizo un cast a producto1 y
producto2 para convertirlos en instancias de la clase Libro y CompactDisc o bien hago
que la clase Producto sea la que implemente IVendible y no las clases derivadas.
Probar las dos soluciones.
Para finalizar poner todas las clases en un proyecto llamado Tienda y Program en
otro. Realizar las modificaciones necesarias para que funcione bien. Se debe dar
incluir en Program un men para permitir realizar todas las operaciones que
hemos implementado.
Carrito
DIAGRAMA DE CLASES
- counter:int
Catalogo
- counter:int
+verCatalogo()
+anadeProducto()
+verProducto()
+Carrito()
+Pvendible()
+AdicionaVendible()
+ getVendible()
+ CalculoCompras
Producto
<<abstract>
-codigo: int
-precio: double
-descripcion: string
+ Producto()
+ PCodigo()
+ PDescripcion()
+ PPrecio()
+ getDescripcionCompleta()
Libro
IVendible
<<interface>>
+getValorVenta()
CompactDisc
-autor:string
-isbn:string
-artista:string
-discogrfica: string
+ Libro()
+ PAutor()
+ PIsbn()
+ getDescripcionCompleta()
+Herencia.Ejercicios
getValorVenta()
+ CompactDisc()
+ getArtista()
+ getDiscografica()
+ getDescripcionCompleta()
+ getValorVenta()
33
Ejercicio 1
Implementar una estructura de clases que contemple un modelo de gestin de Recursos
Humanos que englobe los siguientes elementos:
-
En este sistema a cada tipo de empleado debe corresponder una forma diferente de
clculo de salario:
-
Ejercicio2
Implementar una estructura de clases tal que permita gestionar un aula, para ello
debemos almacenar la informacin de los alumnos y los profesores, as como calcular
las notas (3 parciales y un examen final). Tambin habr materias a las que asistirn
alumnos y que impartirn profesores.
Herencia.Ejercicios
34
Herencia.Ejercicios
35
Herencia.Ejercicios
36