Está en la página 1de 56

CLASE 3 HERENCIA.

CLASES ABSTRACTAS

Animal
Concepto de Herencia.
emitir_sonido();
Sobreescritura y sobrecarga de mtodos.
Ocultamiento de variables
La palabra "super".
Perro
Gato
Constructores en Clases Extendidas
emitir_sonido();
emitir_sonido();
Herencia y redefinicin de miembros
Especificadores de acceso.
Mtodos y clases "final".
Concepto de Delegacin
Herencia vs. Delegacin.
Clases y mtodos abstractos.
Diseando una clase para que sea extensible.
La clase Object: mtodo toString.

NO!!

Concepto de Herencia
El concepto de herencia refiere al hecho de trasmitir algo desde un
organismo a otro.
Supongamos que Mara tiene un hijo entonces esperamos que el hijo de
Mara, herede cosas de ella.
Qu cosas esperamos que herede?
Color de Piel

Rasgos Fsicos

Nacionalidad
Color de Ojos
Apellido
2

Concepto de Herencia
La programacin orientada a objetos permite a las clases expresar
similitudes entre objetos que tienen algunas caractersticas y
comportamiento comn. Estas similitudes pueden expresarse usando
herencia. El trmino herencia se refiere al hecho de que una clase
hereda las caractersticas (atributos, variables) y el comportamiento
(mtodos) de otra clase.

Concepto de Herencia
Si tenemos que modelar una clase TELFONO
Cmo la modelaramos?
- Cules seran sus atributos?
- Cules sera su comportamiento?

TELEFONO
TELEFONO
nmero
nmero
marca
marca
sonar()
sonar()
llamar()
llamar()
4

Concepto de Herencia
Si tenemos que modelar una clase TELFONO CELULAR
Cmo la modelaramos?
- Cules seran sus atributos?
- Cules sera su comportamiento?

TELEFONO
TELEFONOCELULAR
CELULAR
nmero
nmero
marca
marca
antena
antena
sonar()
sonar()
llamar()
llamar()
enviarMensajes()
enviarMensajes()
5

Concepto de Herencia
Si tenemos que modelar una clase TELFONO PBLICO
Cmo la modelaramos?
- Cules seran sus atributos?
- Cules sera su comportamiento?

??

TELEFONO
TELEFONOPUBLICO
PUBLICO
nmero
nmero
marca
marca
ubicacion
ubicacion
llamar()
llamar()
sonar()
sonar()
recibirCredito()
recibirCredito()
controlarCredito()
controlarCredito()

Concepto de Herencia
TELEFONO
TELEFONO
nmero
nmero
marca
marca
sonar()
sonar()
llamar()
llamar()

TELEFONO
TELEFONOCELULAR
CELULAR
nmero
nmero
marca
marca
antena
antena
sonar()
sonar()
llamar()
llamar()
enviarMensajes()
enviarMensajes()

TELEFONO
TELEFONOPUBLICO
PUBLICO
nmero
nmero
marca
marca
ubicacin
ubicacin
llamar()
llamar()
sonar()
sonar()
recibirCredito()
recibirCredito()
controlarCredito()
controlarCredito()

Cada uno de estos tipos de


telfonos que hemos
enumerados tienen
caractersticas comunes
(atributos y mtodos).
Podemos observar claramente
que tanto Telfono Celular
como Telfono Pblico
heredan atributos y
comportamientos del objeto
Telfono.
7

Concepto de Herencia
TELEFONO
TELEFONO
nmero
nmero
marca
marca
sonar()
sonar()
llamar()
llamar()

TELEFONO
TELEFONOCELULAR
CELULAR
nmero
nmero
marca
marca
antena
antena
sonar()
sonar()
llamar()
llamar()
enviarMensajes()
enviarMensajes()

TELEFONO
TELEFONOPUBLICO
PUBLICO
nmero
nmero
marca
marca
ubicacin
ubicacin
llamar()
llamar()
sonar()
sonar()
recibirCredito()
recibirCredito()
controlarCredito()
controlarCredito()

Los atributos heredados no


deben volver a escribirse en la
clase hija, excepto que se
quiera ocultar(*) al atributo de
la clase padre
Los mtodos heredados no
deben volver a escribirse en la
clase hija, excepto que se
quieran sobreescribir(*).
(*) despus se analizarn estos
conceptos

Concepto de Herencia
La herencia es, despus de la agregacin o
composicin, el mecanismo ms utilizado para
alcanzar algunos de los objetivos ms preciados en el
desarrollo de software como lo son la reutilizacin y la
extensibilidad. A travs de ella los diseadores pueden
crear nuevas clases partiendo de una clase o de
una jerarqua de clases preexistente (ya
comprobadas y verificadas) evitando con ello el
rediseo, la modificacin y verificacin de la parte ya
implementada. La herencia facilita la creacin de
objetos a partir de otros ya existentes e implica que
una subclase obtiene todo el comportamiento
(mtodos) y eventualmente los atributos (variables) de
su superclase.
9

Dos formas de herencia

Herencia de contrato o tipo:

la subclase adquiere el tipo de la superclase y


se puede utilizar polimrficamente all donde
se pudiera utilizar la superclase.

Herencia de implementacin:

la subclase adquiere la implementacin de la


superclase en trminos de sus campos y
mtodos accesibles

10

Ejemplo
Una subclase puede agregar
caractersticas y comportamiento
a su superclase y reemplazar o
modificar el comportamiento
heredado.
Automticamente, las subclases los
atributos y mtodos de las
superclases.
Ojo con el acceso !

11

Extends
Cmo indicamos la relacin de herencia
en el cdigo fuente Java? Con la
palabra clave extends

12

Object
La clase Java.lang.Object es la raz de la
jerarqua de clases en Java. Cualquier clase que
no especifique un padre directo, ser subclase
directa de Object.

13

Sobreescribiendo Mtodos
La herencia nos permite concebir una nueva clase de objetos como un refinamiento
de otra clase de objetos ya existente, conservando las similitudes entre las clases de
objetos y especificando solamente las diferencias de la nueva clase de objetos.

La herencia es el mecanismo de los


lenguajes orientados a objetos que
implementa la relacin es un entre
clases. La relacin es un entre clases,
nos permite establecer que una clase es
como otra, con la excepcin de que la
nueva clase incluye cosas extras.

14

Sobreescribiendo Mtodos

Qu pasa si en una subclase se


define un mtodo que tenga
exactamente la misma firma
( nombre, tipo de retorno, y lista de
argumentos (orden,
cantidad y tipo) ) que un mtodo
de la superclase?

15

Sobreescribiendo Mtodos

Hereda todos los mtodos de Animal,


Puede acceder a ellos porque son pblicos
Sobreescribe reproducir()

Hereda todos los mtodos de Animal y Mamifero


Puede acceder a ellos porque son pblicos
Sobreescribe dormir()
Agrega maullar() y cazarRaton()
16

Sobreescribiendo Mtodos
La sobreescritura permite definir un mtodo en una
subclase, que tenga exactamente la misma firma que un
mtodo de la superclase.

gaturro (un Gato)


comer()
reproducir()

Objeto:
Gaturro es una
instancia de la clase
Gato

cazarRatn()
dormir()
maullar()
El objetivo de sobreescribir un mtodo es
cambiar su implementacin.

17

Ocultamiento de variables
Qu pasa si en una subclase se define una variable de instancia del
mismo tipo y nombre que la definida en la superclase?

Oculta la variable
de instancia

18

La palabra reservada super


La palabra super puede utilizarse para invocar a un miembro de la superclase oculto
(atributo) o sobreescrito (mtodo o constructor) por otro de la propia clase.

19

Constructores en clases extendidas


El constructor de una clase extendida puede tratar con variables de estado heredadas,
pero slo su superclase sabe cmo inicializar correctamente su estado, de forma que
cumpla con su contrato.
Los constructores de clases extendidas
deben delegar la construccin del estado
heredado implcitamente, o explcitamente
invocando a un constructor de la
superclase.

SUPER !

20

Ejemplo de constructor de clase extendida


Vehiculo

Auto

21

Especificadores de acceso
Los mtodos que redefinen a otros poseen
sus propios especificadores de acceso.
Una subclase puede modificar el acceso
de los mtodos de la superclase,
pero slo para hacerlos ms accesibles.
Al hacer un mtodo menos accesible
que en la superclase se violara el contrato de la
superclase, ya que una instancia de
la subclase no se podra utilizar en
lugar de una instancia
de la superclase.

Un mtodo privado puede

redefinirse

como protegido o pblico. No al revs

Padre
Igual o mayor accesibilidad

Hijo

22

El operador FINAL
En ocasiones es conveniente que un mtodo no sea redefinido en una clase derivada o
incluso que una clase completa no pueda ser extendida. Para esto est la clusula final,
que tiene significados levemente distintos segn se aplique a un dato miembro, a un
mtodo o a una clase.

23

Clase FINAL
Para una clase, final significa que la clase no puede
extenderse.
Es, por tanto el punto final de la cadena de clases
derivadas.

finalclassTelefono
{
intnmero;
Stringmarca;

final
finalTELEFONO
TELEFONO
nmero
nmero
marca
marca
sonar()
sonar()
llamar()
llamar()

No se puede

TELEFONO
TELEFONOCELULAR
CELULAR
nmero
nmero
marca
marca
antena
antena
sonar()
sonar()
llamar()
llamar()
enviarMensajes()
enviarMensajes()

24

Mtodo FINAL
Para un mtodo, final significa que no puede
redefinirse en una clase derivada. Por ejemplo si
declaramos:
class Telefono
{
. . .
public final void sonar()
{...}
}

TELEFONO
TELEFONO
nmero
nmero
marca
marca
final
final
sonar()
final
sonar()
finalsonar()
sonar()
llamar()
llamar()

No se puede

class TelefonoCelular extends


Telefono
{
. . .
public final void sonar()
{...}
}

TELEFONO
TELEFONOCELULAR
CELULAR
nmero
nmero
marca
marca
antena
antena

sonar()
sonar()
llamar()
llamar()
enviarMensajes()
enviarMensajes()

25

Atributo FINAL
Para un dato miembro, final significa tambin que no puede ser redefinido en una clase
derivada, y que su valor no puede ser cambiado en ningn sitio; es decir el modificador
final sirve tambin para definir valores constantes. Por ejemplo:
classCirculo
{
publicfinalstaticfloatPI=3.141592;
}
Al declarar una variable como final, se previene que su contenido sea modificado. No
obstante, Java permite separar la definicin de la inicializacin. Esta ltima se puede
hacer ms tarde, en tiempo de ejecucin, llamando a mtodos o en funcin de otros
datos.
La variable final as definida, es constante pero no tiene porqu tener el mismo valor en
todas las ejecuciones del programa, pues depende de cmo haya sido inicializada. Esto
es lo ms parecido a las constantes de otros lenguajes de programacin.
26

Concepto de Delegacin
Se llama delegacin a la situacin en la que una
clase contiene (como atributos) una o ms
instancias de otra clase, a las que delegar
parte de sus funcionalidades. Esta relacin entre
clases suele ser la ms indicada cuando es
necesaria una asociacin entre las clases pero
el principio de Liskov no se cumple. Tambin
puede verse como la relacin entre clases "S
contiene a T". Por ejemplo, Vehculo contiene un
Motor, pero Alumno no contiene a Persona, sino
que es una Persona.
Ver Clase 2 La relacin de asociacin:
agregacin y composicin

Vehiculo

Persona

Alumno
Motor

Herencia

Delegacin

27

Herencia vs. Delegacin

La delegacin se caracteriza por "reutilizacin


selectiva", en cambio en herencia es un "todo o
nada". Es cierto que en Composicin y
delegacin se escribe mucho ms que en
herencia, ya que en herencia se hereda de forma
declarativa, y esto simplifica al programador en
ciertos casos. Se habla de la herencia como Caja
Blanca y de Composicin y delegacin como
Caja Negra. Es conveniente usar herencia
cuando la relacin de "Es Un" es clara, es obvia.

Vehiculo
A

?
Motor
B
Delegacin

B
Herencia

Es una buena costumbre usar la delegacin en lugar de la herencia si no es


necesario hacer conversiones hacia arriba. En general, es mejor cualquier tipo de
composicin, si es factible, en lugar de la herencia. Sin embargo solo es una buena
eleccin si simplifica ms de lo que complica.
28

Clases Abstractas
En algunas circunstancias es posible definir clases que
representan un concepto abstracto y como tal no deberan
ser instanciadas.
Pensemos en un ejemplo del mundo real: la comida.
Definimos una clase llamada Comida

Es posible crear diferentes


instancias de la clase Comida?
29

Clases Abstractas
Supongamos que la respuesta es SI.
@#!!

Qu forma tiene?
Qu color? Qu sabor?
Qu temperatura?

No es posible
determinarlo!!!

30

Clases Abstractas
Supongamos que la respuesta es NO.

Esta es la respuesta correctaaaa !!!


La comida como concepto es abstracto, no tiene forma, no tiene color,
no tiene sabor, no tiene temperatura solo representa un conjunto de
sustancias alimenticias que se consumen en diferentes momentos del
da pero de la que no podemos determinar otras caractersticas.

???

la comida, es
una clase
abstracta !
31

Clases Concretas

32

Clases Abstractas
El objetivo de una clase
abstracta es ser extendida
por clases concretas y
definir una interface de
comportamiento comn de
los
objetos
de
sus
subclases.

Comida

Pollo

Hamburguesa

Frutilla

En JAVA para definir clases abstractas se usa la palabra clave abstract


33

Clases Abstractas Ejemplo Cuenta Bancaria


En un banco existen tres tipos de cuenta:
Caja de Ahorro
Cuenta Corriente
Cuentas Universitarias
Si revisamos su comportamiento nos encontraremos con las siguientes
caractersticas en comn:
Todas llevan cuenta de su saldo.
Todas permiten realizar depsitos.
Todas permiten realizar extracciones.
Pero cada una tiene un tipo de restriccin distinto en cuanto a las extracciones:
Cuentas corrientes: permiten que el cliente gire en descubierto (con un tope pactado con
cada cliente).
Cajas de ahorro: poseen una cantidad mxima de extracciones mensuales (para todos
los clientes). No se permite girar en descubierto.
Cuenta universitarias: permite extracciones de no ms de 100$ diarios.

34

Clases Abstractas Ejemplo Cuenta Bancaria


Mtodo abstracto. Se implementa
en las clases extendidas

35

Clases Abstractas Ejemplo Cuenta Bancaria

36

Clases Abstractas Ejemplo Cuenta Bancaria

37

Clases Abstractas Ejemplo Cuenta Bancaria

38

Clases Abstractas Ejemplo Cuenta Bancaria


CajaAhorro

CuentaUniversitaria

CuentaCorriente

39

Diseando una clase para que sea extensible

Especializacin vs. Generalizacin

Una jerarqua de clases puede surgir de dos maneras:

Generalizacin
Especializacin

B
40

Diseando una clase para que sea extensible


Generalizacin

Disear clases por separado.

Descubrir caractersticas comunes y especificas.

Abstraer caractersticas comunes en una nueva clase.

Generar la jerarqua de clases usando la nueva clase como superclase


de las clases previamente generadas.

Eliminar las caractersticas comunes de las subclases.

Verificar que la jerarqua respete el principio es un.


41

Diseando una clase para que sea extensible


Generalizacin

42

Diseando una clase para que sea extensible


Generalizacin

43

Diseando una clase para que sea extensible


Generalizacin

44

Diseando una clase para que sea extensible


Especializacin

Antes de disear una clase, analizar primero las clases


existentes en el sistema.
Buscar una clase que tenga caractersticas comunes con la
que estoy por disear.
Si la relacin entre ambas clases respeta el principio es un,
generar una nueva clase a partir de la clase existente.

45

Diseando una clase para que sea extensible


Especializacin

Antes de disear una clase, analizar primero las clases


existentes en el sistema.

46

Diseando una clase para que sea extensible


Especializacin

Buscar una clase que tenga caractersticas comunes con la


que estoy por disear.

47

Diseando una clase para que sea extensible


Especializacin

Si la relacin entre ambas


clases respeta el principio
es un, generar una
nueva clase a partir de la
clase existente.

48

SOLID
Solid es un acrnimo inventado por Robert C.
Martin para establecer los cinco principios
bsicos de la programacin orientada a objetos y
diseo. Este acrnimo tiene bastante relacin
con los patrones de diseo, en especial, con la
alta cohesin y el bajo acoplamiento.
El objetivo de tener un buen diseo de programacin es abarcar la fase
de mantenimiento de una manera ms legible y sencilla as como
conseguir crear nuevas funcionalidades sin tener que modificar en gran
medida cdigo antiguo.
49

SOLID

50

Ejemplo de clase abstracta


La clase abstracta
Ordenable representa el
algoritmo de ordenacin
por seleccin.

El mtodo abstracto intcompare(Ordenableb)


determina si el objeto this es <, = o > que el parmetro b.
Retorna cero cuando son iguales, un valor negativo cuando this
< b y un valor positivo cuando this > b.
51

Ejemplo de clase abstracta


El mtodo compare(..)
deber ser implementado en
las clases concretas que
implementen la clase
abstracta Ordenable.
Hasta el momento de crear la
clase concreta, no se puede
establecer el criterio de
comparacin entre this y b.
52

Ejemplo de clase abstracta

53

Ejemplo de clase abstracta

54

Ejemplo de clase abstracta

Dentro de la clase abstracta Ordenable, el


mtodo concreto p_menor(...) invoca
al mtodo abstracto compare(...)
55

Ejercicio Terico practico

Volver al ejemplo de Animal Mamifero Gato.

Ampliarlo agregando ms clases.

Agregar mtodos abstractos (que solamente puedan ser abstractos)

Trabajar con alguna coleccin de Animales y ver cmo funciona el


polimorfismo.

56