Está en la página 1de 10

04/12/2008

Índice
† Definición
† Ventajas
Tema 7 - Herencia † Situaciones en las que se aplica la herencia
Luis Gonzaga Pérez Cordón † Tipos de Herencia
† Herencia en C#

Definición Ejemplo
† La herencia es un mecanismo de la P.D.O. A es un ascendiente o superclase de B. Si la
que permite construir una clase incorporando A herencia entre A y B es directa decimos que A es
la clase padre de B
de manera implícita todas las características
de una clase previamente existente.
B es un descendiente o subclase de A. Si la
herencia entre A y B es directa decimos además
que B es una clase hija de A
B

Situaciones en las que se aplica la


Ventajas herencia
† Modelado de la realidad: las relaciones de † Situaciones:
especialización/generalización entre las „ Especialización
entidades del mundo real. „ Extensión
† Evita redundancias „ Especificación
† Facilita la reutilización „ Construcción ?????
† Sirve de soporte para el polimorfismo

1
04/12/2008

Situaciones en las que se aplica la Situaciones en las que se aplica la


herencia herencia
† Especialización: Dado un concepto B y otro † Extensión: una clase puede servir para
concepto A que representa una extender la funcionalidad de una superclase
especialización de B, entonces puede sin que represente necesariamente un
establecerse una relación de herencia entre las concepto más específico.
clases de objetos que representan a A y B.
Vendedor
Vehículo

A es un B: un Coche es un Vehículo

Coche VendedorConVehículo

Situaciones en las que se aplica la Situaciones en las que se aplica la


herencia herencia
† Especificación: Una superclase puede servir † Construcción: Una clase puede construirse a
para especificar la funcionalidad mínima partir de otra, simplemente porque la hija
común de un conjunto de descendientes. puede aprovechar internamente parte o toda la
ObjetoGrafico:
seleccionar
funcionalidad del padre, aunque representen
mover entidades sin conexión alguna.
escalar
cambiarColor Lista

Texto Línea Cuadrado Pila

Situaciones en las que se aplica la Situaciones en las que se aplica la


herencia herencia
Cuenta
† Construcción: ¡¡MAL USO DE LA † Ejemplo: ------------------
long numero;
HERENCIA!!. No se debe emplear en estos String titular;
double saldo;
casos. Si necesita la funcionalidad de una lista double interes;
----------------
debe USAR una lista, no HEREDAR de una ingreso()
lista. ingresoInteresMes();
leerSaldo();
transferirA();

CuentaAhorroPFijo PlanPensiones
CuentaCorriente -------------------- ----------------
----------------- Date vencimiento; Date vencimiento;
Reintegro(); -------------------- float cotización;
ingresoMes(); String numCuentaOrigen;

2
04/12/2008

Tipos de Herencia Tipos de Herencia


† Principalmente existen dos tipos de herencia. † Herencia simple:
„ Herencia simple: una clase solo puede tener un „ Muy fácil de entender y manejar tanto por el
padre, por lo tanto la estructura de clases será en lenguaje como por el programador.
f
forma de
d arbol.
b l „ Limitada puesto que en el mundo real un objeto
„ Herencia múltiple: Una clase puede tener uno o puede pertenecer a varias clases y sin embargo
varios padres. La estructura de clases es un grafo aquí esta situación no se puede modelar

Tipos de Herencia Tipos de Herencia


† Herencia múltiple: † Ejemplo de herencia múltiple
„ Es mas realista y da al programador más libertad
y mas posibilidades de reutilización de código.
MedioComunicacion ObjetoFísico
„ Es mucho más difícil de utilizar por la posibilidad
de ciclos y para los lenguajes de programación es
muy costoso el permitirlo.

ElAire Teléfono

Tipos de Herencia Herencia en C#


† Ejemplo herencia múltiple: † Características
Constructor † Como se utiliza
----------------------------
Colegio
Co eg o colegio;
co eg o; † Redefinición de métodos, constructores,…
† Como funciona la gestión de tipos en C#
Arquitecto Aparejador
-------------------- -------------------- † Métodos y clases abstractas
construir() construir()
† Interfaces
ArquitectoYAparejador † Ejemplos de herencia
----------------
Colegio colegio; ?????
construir()??????

3
04/12/2008

Herencia en C# Herencia en C#
† Características † Como se utiliza:
„ Herencia simple
„ Estructura jerárquica en árbol en donde en la raiz
podemos encontrar la clase object, de las que
heredan todas las clases.
† Todas las clases tienen un padre
† Todos los objetos son “object”
„ C# no permite que una subclase elimine un
método o una variable de instancia aunque esta no
la necesite

Herencia en C# Herencia en C#

Redefinición de métodos,constructores,
Herencia en C# …
† ¿Qué pasa si en la superclase hay un método
que funciona distinto a como nos gustaría que
funcionara en la subclase?
† ¿Son las subclases responsables de inicializar
en sus constructores las variables heredadas
de las superclases?
† ¿Qué pasa si un método de la superclase no
debiera aparecer en la subclase?

4
04/12/2008

Redefinición de métodos Redefinición de métodos


† Los métodos que se puedan redefinir deben † Redefinición de métodos
incluir la palabra reservada virtual
† Cuando redefina un método este debe utilizar
la palabra reservada override

Redefinición de métodos Redefinición de métodos

Constructores Constructores
† Las subclases NO son responsables de
inicializar las variables de instancia de las
variables que hereda
† Para pasarle la responsabilidad de inicializar
esas variables a las superclases puede llamar
al constructor de estas mediante la sentencia
:base()
† Hay una especia de “herencia” de
constructores

5
04/12/2008

Acceso a método de la clase base Eliminación de métodos


† Se puede acceder mediante la palabra † C# no lo permite
reservada base † Solución: redefinir el método en las subclases
para que se genero un error en caso de que se
llame a un método no permitido

Gestión de tipo en C# Métodos y clases abstractas


† Se permite asignar a una variable todos los † Un método se dice que es abstracto si lo
objetos de generados a partir de esta clase y declaramos pero no lo implementamos.
de sus subclases pero a la inversa esto no es † Utilidad:
cierto (no se cumple la condición de que una „ podemos
d ll
llamar a métodos
ét d que aún ú no hemos
h
implementado o que se tienen que implementar
cosa ES otra) en la subclases.
Ave ave;
Gallina gallina = new Gallina(); „ Podemos declarar métodos que tendrán todas las
ave = gallina /* todas las gallinas SON aves */
subclases pero que no se pueden implementar en
la superclase
Ave ave=new Ave();
Gallina gallina;
† Útil en polimorfismo
gallina = ave /* NO todas las gallinas SON aves */

Métodos y clases abstractas Métodos y clases abstractas


† ¿Qué pasa si tenemos tres clases que
comparten un mismo mensaje pero que su
implementación es distinta en las tres?

6
04/12/2008

Métodos y clases abstractas Métodos y clases abstractas


† Si creamos una superclase vehículo:
„ ¿Qué hacemos con el método moverse?
„ ¿Debe estar en la superclase? ¿es un método que
tendrán todas subclases de vehículo?
„ ¿Qué implementación tendrá en la superclase?
„ ¿Me aporta alguna ventaja?

Métodos y clases abstractas


† Moverse en la superclase será un método
abstracto:
„ Ventajas:
† Las subclases tarde o temprano tienen que
implementarlo.
† En la superclases en donde este definido puede ser
utilizado aunque no este implementado.

Métodos y clases abstractas


† Una clase abstracta es una clase en la que al
menos tiene un método que es abstracto.
„ Este(os) método(s) abstracto(s) puede que lo haya
definido el o que los haya heredado.
heredado
„ Un clase abstracta NO puede instanciar objetos
¿Qué pasaría si se llamara a un método abstracto?
¿y si se llamara a un método no abstracto pero que
usa un método abstracto?
† Para que una clase se declare como abstracta
tenemos que usar la palabra clave abstract

7
04/12/2008

Métodos y clases abstractas Interfaces


† IMPORTANTE: Para que un clase que hereda † Definición informal:
de una superclase abstracta pueda instanciar „ Es una clase abstracta sin variables de instancia
objetos debe de implementar todos los en donde todos sus métodos son abstractos
métodos abstractos que ha heredado, porque † Definición formal:
si no lo hiciera, también sería una clase „ Es un contrato que establece una clase en el cual
abstracta. esta clase asegura que implementará un conjunto
de métodos

Interfaces Interfaces
† Para que una clase use un interfaz debe
implementar todos sus métodos e indicar que
está usando un interfaz.

Interfaces
† Utilidad de los interfaces: “simular” herencia
múltiple.
† Nota: los interfaces solo tienen sentido en
lenguajes de programación que solo permiten
usar la herencia simple

8
04/12/2008

Ejercicio Ejercicio
† Diseñar un ecosistema donde podemos encontrar † Ecosistema con herencia múltiple
varios tipos de animales (gatos, perros, leones,
ratones,…). Algunos de estos animales son
depredadores (comen para obtener “energía”)
energía ) y
otros presas (son comidos y proporcionan
“energía”), y otros pueden actuar tanto como
depredadores como presas.
„ Diseñar este ecosistema empleando herencia múltiple
„ Diseñar este ecosistema empleando herencia sencilla

Ejercicio Ejercicio
† Ecosistema con herencia múltiple † Ecosistema con herencia sencilla
„ Ventajas de esta representación:
† Es la más cercana al modelo real
† Reutilizamos código de las superclases
„ Desventajas:
† Pocos lenguajes de programación admiten herencia
múltiple (C++)
† Es más difícil de implementar (ciclos, variables
distintas de distintitas clases pero con el mismo
nombre,…)

Ejercicio Ejercicio
† Ecosistema con herencia sencilla † Ecosistema con herencia sencilla y interfaces
„ Ventajas:
† Si lo implementamos bien puede simular el mismo
modelo
d l
„ Desventajas:
† Las clases dejan de representar lo que deberían de
representar
† Las subclases deben anular métodos porque si no se hace
podrían hacer cosas raras (un ratón podría comerse un
perro) -> ¿Qué pasa si tengo herencia múltiple con
muchas clases? problemas con los olvidos

9
04/12/2008

Ejercicio Ejercicio
† Ecosistema con herencia sencilla y interfaces † Ecosistema con herencia sencilla y interfaces
„ Ventajas: (segundo enfoque):
† El modelo refleja bastante fielmente la situación real
† Las clases implementadas son conceptualmente
correctas
„ Desventajas:
† Se deben implementar los interfaces. No hay
reutilización de código.

Ejercicio
† Ecosistema con herencia sencilla y interfaces
(segundo enfoque):
„ Ventajas
† El modelo refleja bastante fielmente la situación real
† No hay que implementar los interfaces
„ Desventajas
† Las clases implementadas no son del todo
conceptualmente correctas pero evitamos un mal uso

10

También podría gustarte