Академический Документы
Профессиональный Документы
Культура Документы
Nombre de la Practica:
Lugar de Ejecucin:
Centro de Computo
Tiempo Estimado:
2 horas y 30 minutos
Materia:
Lenguajes de Programacin 1
I. OBJETIVOS
HERENCIA Y POLIMORFISMO
El manejo de propiedades, mtodos y eventos es slo el principio de la programacin orientada a
objetos; las caractersticas principales de la POO descansan en la capacidad de los objetos para trabajar
en colaboracin con otros objetos, y de aprovechar total o parcialmente su funcionalidad mediante la
reutilizacin de cdigo segn lo requieran las aplicaciones.
A continuacin se estudiar los principios que permiten el mximo aprovechamiento del cdigo a
travs de POO y con sus dos capacidades caractersticas: herencia y polimorfismo.
Herencia
La herencia (inheritance) es un concepto fundamental de la programacin orientada a objetos, y
consiste en la capacidad de definir clases que sirven como base de otras clases, evitando la
redundancia en la definicin de elementos como mtodos, eventos y propiedades. Hay una clase
base y una o varias clases derivadas; las clases derivadas aprovechan todo lo declarado en la clase base,
asumindolo como suyo y utilizando capacidades que no estn codificadas en ellas.
Las clases derivadas pueden heredar, e incluso extender, las propiedades, los mtodos y los eventos de
la clase base. Es posible tambin que las clases derivadas sustituyan o modifiquen (override) la
funcionalidad de los mtodos de la clase base.
1
End Class
En este caso, la clase derivada dispone de todos los elementos declarados en la clase base.
Lenguajes de Programacin 1
End Class
En este caso, intentar heredar NombreClase generara un error (Inherits NombreClase).
Mustlnherit (Debe heredar)
Como sabemos, los objetos son instancias de una clase. Ya se explicaba que no se puede tener acceso a
la funcionalidad de una clase sino a travs de una instancia de la misma, es decir, de un objeto basado
en la clase. Eso es verdadero slo relativamente.
Habr alguna forma de que podamos disponer de la funcionalidad de una clase sin generar una
instancia de la misma?
La respuesta es que s. Podemos declarar una clase que no pueda instanciarse pero que pueda ser
utilizada slo si se hereda por otra clase. Para hacer eso es necesario especificar el estatuto Mustlnherit.
La sintaxis es la siguiente:
Mustlnherit Class NombreClase
End Class
En este caso, instanciar NombreClase generara error (Dim Objeto As New NombreClase())
Modificadores de acceso, necesarios para la herencia.
Usted debe determinar el alcance que tendr su jerarqua de clases, a efecto de restringir el acceso a las
clases, de tal manera que slo puedan heredarlas aquellas porciones de cdigo que deban hacerlo.
Calificar una clase como clase pblica (public class), se logra utilizando el modificador de acceso Public
al momento de la declaracin de la clase. Esto garantiza que todas las clases podrn utilizar la clase
todo el tiempo; en este caso, el acceso es abierto.
Lenguajes de Programacin 1
Si no quiere una clase de acceso abierto, puede restringir el acceso a la clase utilizando los
modificadores de acceso Friend y Private.
Tome en cuenta que en una jerarqua de clases el acceso puede heredarse slo hacia un acceso igual o
mayor, nunca menor: una clase con acceso Public no puede heredar una clase Friend o Private, y una
clase Friend no puede heredar una Private.
Estatutos auxiliares para el manejo de herencia y polimorfismo
En ocasiones heredamos una clase, pero nos damos cuenta que algunas entidades (mtodos,
propiedades, eventos) no se ajustan del todo a lo que verdaderamente necesitamos; en resumen, no nos
sirven tal y como fueron heredadas. Es posible que pensemos que los elementos heredados son tiles,
pero que lo seran ms con algunas pequeas modificaciones.
Dichas modificaciones se realizan en la clase derivada, respecto de las definiciones originales existentes
en la clase base.
La programacin orientada a objetos hace posible que eso suceda, pues permite implementar diferentes
comportamientos para un mtodo (override), o de plano remplazarlo por completo (overload). La
funcionalidad heredada puede modificarse por otra que sea ms indicada para el problema de
programacin que deseamos resolver; con ello se promueve que la reutilizacin del cdigo sea flexible
y adaptable.
Por omisin, una clase derivada hereda los mtodos y propiedades de su clase base. Si necesitamos que
una propiedad o mtodo heredado se comporte de manera distinta a como se defini en la clase base,
puede ser implementada de forma distinta (overridden) o remplazada (overloaded); esto quiere decir
que la herencia sirve hasta donde nosotros deseamos comenzar a hacer modificaciones.
Los estatutos auxiliares de herencia sirven para especificar el grado de modificacin que ha de darse
entre la clase derivada y la clase base; estos son: Overridable, NotOverridable, Overrides.
MustOverride y Overloads.
En cuanto a la clase base hay tres escenarios:
Lenguajes de Programacin 1
Lenguajes de Programacin 1
En este ltimo caso, Overrides no sirve pues exige igualdad de argumentos. Para poder lograr nuestro
cometido, debemos utilizar Overloads, que indica la sustitucin del mtodo de la clase base por otro de
la clase derivada, tengan o no relacin entre s. Overloads es la nica forma de implementar, bajo un
mismo nombre, dos mtodos que no coinciden ms que en el nombre.
MyBase y MyClass
Se puede utilizar la palabra reservada MyBase para llamar a ejecucin a un mtodo de la clase base
desde una clase derivada. Esto quiere decir que a) si existe herencia entre dos clases, y b) en la clase
derivada se modifica un mtodo, entonces c) es posible mandar llamar a ejecucin al mtodo, ya sea en
la forma en que se encuentra en la clase base, o en la forma en que se encuentra en la clase derivada
misma.
Con MyBase podemos obligar a la aplicacin a que utilice un mtodo de la clase base y no de la clase
derivada; en caso contrario, es posible que queramos mandar llamar el mtodo tal y como est en la
clase derivada. Para ello utilizamos la palabra reservada MyClass, que se encarga de llamar a ejecucin
un mtodo que se encuentra en la misma clase cuando esta es derivada.
Es importante saber que tanto MyBase como MyClass, aunque en su manejo parecen objetos, realmente
no lo son. No se instancian; existen porque el lenguaje los proporciona para un manejo ms flexible de
la herencia y el polimorfismo.
Polimorfismo
El polimorfismo es la habilidad que tiene el lenguaje para definir mltiples clases que contengan
mtodos y propiedades del mismo nombre, pero que brindan diferente funcionalidad.
Cuando se presenta el polimorfismo es posible elegir, en tiempo de ejecucin, aquellos mtodos o
propiedades que necesitamos. No importa que varias clases posean los mismos mtodos y las mismas
propiedades: la aplicacin debe ser capaz de utilizar precisamente aquellas cuya funcionalidad estemos
invocando.
La herencia y la sustitucin de mtodos y propiedades tienen mucho que ver con el polimorfismo.
Cuando se declara una clase y a partir de sta se derivan otras clases, estamos ante la presencia de la
herencia; si adems de esto, los mtodos y propiedades de la clase base que fueron heredados son
modificados (Overriden) o sustituidos (Overloaded) en la clase derivada, de tal manera que comparten
el mismo nombre pero no la misma funcionalidad, estamos ante el polimorfismo. Una manifestacin
an ms pura del polimorfismos se presenta cuando se utiliza Overloads, que implica una sustitucin
completa de meto que se encuentran en clases que guardan una relacin de herencia.
Cuando en una clase derivada se modifican mtodos o propiedades de la clase base, se dice que hay
polimorfismo basado en herencia.
Lenguajes de Programacin 1
Requerimiento
Cantidad
Memoria USB
IV. PROCEDIMIENTO
Para esta prctica deber crear una carpeta con el nombre de Guia7LP1_SuCarnet, en la cual va a
guardar todos los archivos de esta prctica.
Ejercicio 1. Uso de Herencia
1. Abrir un nuevo proyecto en Visual Basic 2012
2. Colocar como nombre del proyecto: Guia7Ejercicio1
En este ejercicio la aplicacin debe calcular los descuentos y el sueldo neto de un empleado. Los datos
que necesita son los siguientes: Nombre, sueldo base y horas extras, se conoce que el empleado puede
laborar en cualquier turno ya sea maana o noche y las horas extras se pagan de acuerdo a ese turno (si
es en la maana cada hora extra vale $10 y si el turno es en la noche cada hora extra vale $15), para
calcular los descuentos debe tomar en cuenta que: Si el empleado trabaja en la maana este no tiene
seguro de vida, solamente tiene seguro de vida aquel empleado que trabaja en la noche.
Lenguajes de Programacin 1
Descuentos:
Seguro=Sueldo base *10%
Seguro de vida=Sueldo base *12%
Sueldo Neto:
Sueldo neto= (Sueldo base + horas extras * pago por hora) descuentos
3. Crear el siguiente diseo del formulario del proyecto
4. Cambiar las propiedades de los controles del formulario, as como se muestra en la siguiente
tabla:
Control
Name
GroupBox2
Text
Datos del
Empleado
Descuentos
GroupBox3
Turno
GroupBox1
Label1
Label2
Label3
Label4
lblnombre
lblsueldobase
lblhorasextras
lblpagoporhora
Label5
lblseguro
Lenguajes de Programacin 1
Propiedades
Font
Microsoft Sans Serif;
Negrita; 9
Microsoft Sans Serif;
Negrita; 9
Microsoft Sans Serif;
Negrita; 9
Nombre:
Sueldo Base: $
Horas Extras:
Pago por hora
extra: $
Seguro: $
8
Enabled
False
ReadOnly
Label6
Label7
lblsegurovida
lblsueldoneto
TextBox1
TextBox2
TextBox3
TextBox4
TextBox5
TextBox6
Label8
txtnombre
txtsueldobase
txthorasextras
txtpagoporhora
txtseguro
txtsegurovida
txtsueldoneto
0.00
RadioButton1
RadioButton2
Button1
turnomaana
turnonoche
btncalcular
Maana
Noche
Calcular
Button2
btnsalir
Salir
Seguro de Vida: $
Sueldo Neto: $
True
True
Microsoft Sans Serif;
Negrita; 9
Lenguajes de Programacin 1
False
Lenguajes de Programacin 1
10
11. Haga doble clic en el primer control de RadioButton (turnomaana) y coloque el siguiente
cdigo:
12. Haga doble clic en el segundo control de RadioButton (turnonoche) y coloque el siguiente
cdigo:
Lenguajes de Programacin 1
11
Ejercicio complementario:
1. Coloque las validaciones necesarias en cada una de las entradas de datos
2. Modifique la aplicacin, de tal manera solo se tenga un mtodo descuentos, no importa si la
clase 2 se queda sin mtodos, por el momento.
3. Guardar los datos en un archivo de texto
12
7. Agregue un mtodo de nombre CalculaPago(), que ser pblico y que devolver un valor
Decimal, dentro de este mtodo agregar el Modificador de herencia Overridable.
8. En este punto, el cdigo del modulo debe lucir de la siguiente manera:
Lenguajes de Programacin 1
13
9. Coloque como argumentos de CalculaPago() las horas trabajadas y el pago por hora.
Complemente el mtodo, a fin de que proporcione un resultado. El procedimiento debe quedar
de la siguiente manera:
10. Agregue una clase llamada PagoBonificado, que ser pblica y que se agregara al mdulo que
estamos trabajando. A esta clase agregue un mtodo de nombre CalculaPago(), que ser pblico
y devolver un valor Decimal
11. Edite el programa y agregue una lnea que especifique que la nueva clase hereda la
funcionalidad de la clase Pago (Inherits Pago). Aqu se generara una contaminacin de espacios
de nombres, dado que Pago ya posee un mtodo llamado CalculaPago(), y al estar heredando
su funcionalidad, equivaldra a estar definiendo dos miembros con el mismo nombre, lo cual no
es posible. Para evitar el problema, seleccione el mtodo CalculaPago () de PagoBonificado
deber modificarse la propiedad Modificador de herencia asignando un valor Overrides. Dado
que se est realizando una operacin de reemplazo (overrides), los argumentos del mtodo
deben ser exactamente los mismos. La nica variante entre los dos procedimientos es que el
mtodo CalculaPago() de la clase PagoBonificado retorna el monto a pagar multiplicado por la
constante de bono de puntualidad. Seguramente se dio cuenta de que el monto a pagar es un
dato que ya ofrece CalculaPago() de la clase Pago, por lo que se consume el mtodo de la clase
base. Cuando haya agregado la opcin overrides, codifique lo que hace falte, al final la clase
tiene que quedar de la siguiente manera:
Lenguajes de Programacin 1
14
12. Agregue una clase llamada PagoBonificadoExtra, que ser pblica y que se agregara al mdulo
que estamos trabajando. A la nueva clase agregue un mtodo de nombre CalculoPago(), que
ser pblico y devolver un valor decimal.
13. Edite el programa y agregue una lnea que especifique que la nueva clase hereda la
funcionalidad de la clase PagoBonificado. Aqu se generara una contaminacin de espacios de
nombres, dado que Pago ya posee un mtodo llamado CalculaPago(), y al estar heredando su
funcionalidad, equivaldra a estar definiendo dos miembros con el mismo nombre, lo cual no es
posible.
14. Hay otro problema: el nuevo mtodo, adems de los beneficios de puntualidad, integrar un
beneficio adicional que el usuario podr especificar, por lo cual el mtodo CalculaPago() no
tiene el mismo nmero de argumentos que CalculaPago() de la clase PagoBonificado, por lo que
una operacin de remplazo no es posible. Deber realizarse una operacin de sustitucin
(overload) para que los argumentos del mtodo no necesariamente sean los mismos. Se tiene
que agregar el valor Overload para Modificador de herencia (lo cual tiene mucho sentido si
consideramos que la sustitucin tiene que ver ms con el polimorfismo que con la herencia). La
nica variante entre los dos procedimientos es que el mtodo CalculaPago() de la clase
PagoBonificadoExtra devuelve el monto a pagar multiplicado por la constante de bono de
puntualidad (informacin que ofrece el mtodo CalculaPago () de la clase base), y adems le
agrega un porcentaje adicional de beneficio.
15. Desarrolle el punto anterior modificando la siguiente clase a su programa, busque la clase
PagoBonificadoExtra y verifique que al final le queda el siguiente cdigo:
Lenguajes de Programacin 1
15
16. Regrese al formulario, haga clic derecho sobre este y seleccione la opcin Ver cdigo y escribir
el siguiente cdigo:
Lenguajes de Programacin 1
16
Dentro del formulario se genera una instancia de la clase Pago, una instancia de la clase
PagoBonificado y una instancia de PagoBonificadoExtra. La funcionalidad de nuestras
clases est disponible a travs de las variables objeto que acabamos de definir. Otro dato que
se provee es el nmero de horas por semana sobre las que se calculan los pagos (TextBox1) y
el nmero de Pago por hora (Textbox2).
Lenguajes de Programacin 1
17
VI. BIBLIOGRAFA
Bill Evjen, Jason Beres y otros (2002), El libro de Visual Basic.NET (1era Ed), Espaa. Editorial
Anaya
Ceballos, Francisco Javier (2006), ENCICLOPEDIA DE MICROSOFT VISUAL BASIC (1er Ed),
Mexico, Editorial ALFAOMEGA, ISBN: 9701512189
Lenguajes de Programacin 1
18