herencia

25
1 Profesora Yasna Meza Hidalgo mailto mailto: : [email protected] [email protected] Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 2 Orientación a objetos Clase Objeto Encapsulación Relaciones entre clases

Upload: ymeza

Post on 10-Jun-2015

584 views

Category:

Documents


0 download

DESCRIPTION

Diapositivas revisadas en clases. Temas relacionados Herencia y Polimorfismo

TRANSCRIPT

Page 1: Herencia

1

��������

ProfesoraYasna Meza Hidalgo

mailtomailto: : [email protected]@ubiobio.cl

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 2

������ �����

� Orientación a objetos� Clase� Objeto� Encapsulación� Relaciones entre clases

Page 2: Herencia

2

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 3

�������� � ���� �

� Suponga que se desea manejar información acerca de los empleados de una empresa.

� Se sabe que los empleados se dividen en Empleados Fijos y Empleados a Honorarios.

� Los Empleados fijos cuentan con un sueldo base y un número de cargas, por su parte los empleados a honorarios cuentan con un valor por hora y un número de horas trabajadas.

� Independiente del tipo de empleado que se trate cada uno de ellos, tiene un nombre, un RUT y una ciudad de residencia.

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 4

�������� � ���� �

� Cada empleado tiene un RUT, un nombre y una ciudad de residencia.

EMPLEADO

- RUT- Nombre- Ciudad

+ RUT()+ nombre()+ ciudad()+ imprimir()

public class Empleado

{/* Definición de atributos */

private String RUT;

private String nombre;

private String ciudad;

/* Definición de métodos */

}

Page 3: Herencia

3

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 5

�������� � ���� �

� Cada empleado fijo tiene los antecedentes comunes a todo empleado, además, de un sueldo fijo y un número de cargas.

EMPLEADO FIJO

- RUT- Nombre- Ciudad- Sueldo_Fijo- Numero_Cargas

+ RUT()+ nombre()+ ciudad()+ sueldo()+ cargas()+ imprimir()

public class EmpleadoFijo

{/* Definición de atributos */

private String RUT;

private String nombre;

private String ciudad;

private long sueldo_fijo;

private int numero_cargas;

/* Definición de métodos */

}

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 6

�������� � ���� �

� Cada empleado a honorarios tiene los antecedentes comunes a todo empleado, además, de un valor cancelado por hora y un número de horas trabajadas.

EMPLEADO HONORARIO

- RUT- Nombre- Ciudad- Valor_Hora- Numero_Horas

+ RUT()+ nombre()+ ciudad()+ valorhora()+ horas()+ imprimir()

public class EmpleadoHonorario

{/* Definición de atributos */

private String RUT;

private String nombre;

private String ciudad;

private long valor_hora;

private int numero_horas;

/* Definición de métodos */

}

Page 4: Herencia

4

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 7

�������� � ���� �

� De esta forma se tienen tres clases definidas

EMPLEADO HONORARIO

- RUT- Nombre- Ciudad- Valor_Hora- Numero_Horas

+ RUT()+ nombre()+ ciudad()+ valorhora()+ horas()+ imprimir()

EMPLEADO FIJO

- RUT- Nombre- Ciudad- Sueldo_Fijo- Numero_Cargas

+ RUT()+ nombre()+ ciudad()+ sueldo()+ cargas()+ imprimir()

EMPLEADO

- RUT- Nombre- Ciudad

+ RUT()+ nombre()+ ciudad()+ imprimir()

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 8

�������� � ���� �

� Información REPETIDA, que es común a todos los elementos.

EMPLEADO HONORARIO

- RUT- Nombre- Ciudad- Valor_Hora- Numero_Horas

+ RUT()+ nombre()+ ciudad()+ valorhora()+ horas()+ imprimir()

EMPLEADO FIJO

- RUT- Nombre- Ciudad- Sueldo_Fijo- Numero_Cargas

+ RUT()+ nombre()+ ciudad()+ sueldo()+ cargas()+ imprimir()

EMPLEADO

- RUT- Nombre- Ciudad

+ RUT()+ nombre()+ ciudad()+ imprimir()

Page 5: Herencia

5

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 9

�������� � ���� �

EMPLEADO HONORARIO- Valor_Hora- Numero_Horas

+ valorhora()+ horas()

EMPLEADO FIJO

- Sueldo_Fijo- Numero_Cargas

+ sueldo()+ cargas()

EMPLEADO- RUT- Nombre- Ciudad

+ RUT()+ nombre()+ ciudad()+ imprimir()

Superclase

Subclase 1 Subclase 2

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 10

��������

� Permite que las clases puedan heredar atributos y operaciones de otras clases.

Dibujar()

centro

FIGURA

Dibujar()

CUADRILATERO

Dibujar()

CÍRCULO

Perímetro()

CUADRADO

Área()

RECTÁNGULO

Subclases de Figura

SuperclaseSuperclase respecto de CUADRADO Y RECTÁNGULO Redefine la

operación dibujar

Hereda el atributo centro y el método Dibujar() y agrega un método que calcula el área

Page 6: Herencia

6

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 11

�������� �� ����

¿Cómo se define una subclase en

Java?

public class <nombre hija> extends <nombre padre>

{

}Palabra reservada que representa la relación de herencia entre clases

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 12

�������� �� ����

¿Qué pasa con la visibilidad de los atributos y métodos definidos

en la clase padre?

Los atributos definidos como privados NO SON VISIBLES dentro de las subclases.

Las subclases los heredan, pero NO PUEDEN ACCEDER a ellos.

Page 7: Herencia

7

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 13

�������� �� ����

Entonces, cuando se quiera crear un

objeto de la clase Empleado Fijo por ejemplo, ¿Cómo se va a acceder a los atributos de la clase Empleado?

Para definir el constructor de la clase EmpleadoFijose DEBE hacer uso del constructor de la clase Empleado que se haya definido.

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 14

�������� �� ����

¿Cómo se hace uso del constructor de una clase padre en una clase hija?, porque el siguiente código

marca un error …

public class EmpleadoFijo extends Empleado

{

/* Definición de atributos */

/* Definición de constructor */

public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas)

{

RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad;sueldo_fijo = n_sueldo; numero_cargas = n_cargas;

}

}

Page 8: Herencia

8

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 15

�������� �� ����public class Empleado

{

/* Definición de atributos */

/* Definición de constructor */

public Empleado(String n_rut, String n_nombre, String n_ciudad)

{

RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad;

}

}

public class EmpleadoFijo extends Empleado

{

/* Definición de atributos */

/* Definición de constructor */

public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas)

{

super(n_rut, n_nombre, n_ciudad); sueldo_fijo = n_sueldo; numero_cargas = n_cargas;

}

}

Forma de invocar al constructor de la clase padre

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 16

�������� �� ����Sin embargo, existe un tipo de visibilidad que permite tener visibilidad de los atributos en las clases hijas.

¿Cuál es ese tipo de

visibilidad?

Page 9: Herencia

9

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 17

�������� �� ����public class Empleado

{

/* Definición de atributos */

protected String RUT, nombre, ciudad;

}

public class EmpleadoFijo extends Empleado

{

/* Definición de atributos */

/* Definición de constructor */

public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas)

{

RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad;sueldo_fijo = n_sueldo; numero_cargas = n_cargas;

}

}

Ahora es válido el acceso a estos atributos.

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 18

�������� �� ����

Object

A B

C D

• C y D son subclases de B.• B es superclase de C y D• A y B son subclases de Object

Page 10: Herencia

10

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 19

�������� �� ���� � ���������

�� ���

Java es un lenguaje fuertemente tipado

¿Y eso quésignifica …?

Realiza la comprobación de tipos en tiempo de compilación

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 20

��������� �� ���

Conversión implícitaConversión explícita

float saldo = 200; /* Es posible asignarle un entero */int codigo = 3.7; /* ERROR*/

Figura f;Cuadrado c = new Cuadrado();f = c;

Page 11: Herencia

11

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 21

��������� �� ���

Conversión implícitaConversión explícita

int i = 200;long l = (long) i;

También existe el caso de la conversión de referencias (cast-down).

Sin embargo, esto no siempre es válido …

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 22

��������� �� ���

Figura[] figuras = new Figura[30];…Rectangulo r = (Rectangulo) figuras[i];

ERROREn tiempo de ejecución

Cuenta c = (Cuenta) figuras[i];

ERROREn tiempo de compilación

Page 12: Herencia

12

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 23

�������� �� ���� � ������������

Cuando un método de la subclase tiene la misma signatura y valor de retorno que un método de la superclase se dice que la subclase lo estáREDEFINIENDO.

Los atributos no se puede redefinir, sólo OCULTAN (el campo de la superclase todavía

existe pero no se puede acceder).

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 24

�������� �� ���� � ������������

POLÍGONO- NumVertices- Vertices[]

+ numVertices()+ Vertice(int)+ perímetro()

RECTÁNGULO

- Lado1- Lado2

+ perímetro()

Page 13: Herencia

13

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 25

�������� �� ���� � ������������public class Poligono{

private Punto[] vértices;private int numVertices;...public float Perimetro(){

float perimetro = 0 ;Punto anterior = vertices[0];Punto actual ;int ultimo = numVertices – 1;for(int i=1 ; i <= ultimo ; i++){

actual = vertices[i];perimetro+= anterior.distancia(actual) ;anterior = actual ;

}/* Distancia del último con el primero */return ( perímetro+=vértices[ultimo.distancia(vértices[0]))

}}

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 26

�������� �� ���� � ������������

public class Rectangulo extends Poligono{

private double lado1;private double lado2;...public float Perimetro(){

return (2*lado1 + 2*lado2) ;}

}

Redefine método Perímetro()

Page 14: Herencia

14

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 27

���� ����� � ��������

����� ���

Poligono p;/* Puede referenciar a un objeto Polígono o Rectángulo */Rectangulo r = new Rectangulo();p = r;float peri = p.Perimetro();

¿Cuál de los dos métodos

perimetro() invocará?

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 28

� �� ����

public class Punto{

private int x, y;public void borrar() {}

}public class Píxel extends Punto{

…public void borrar(){

super.borrar(); /* Borra el punto */color = null;

}}

¿Cuál es la interpretación de la llamada

super.borrar()?

Page 15: Herencia

15

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 29

� �� ���� ! �"��

public class Uno{

public int test() { return 1;}public int result1() { return this.test(); }

}public class Dos extends Uno{

public int test() { return 2;}}public class Tres extends Dos{

public int result2() { return this.result1();}public int result3() { return super.test();}

}public class Cuatro extends Tres{

Public int test() { return 4; }}

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 30

� �� ���� ! �"��public class PruebaSuperThis{

public static void main(String args[]){

Uno obj1 = new Uno();Dos obj2 = new Dos();Tres obj3 = new Tres();Cuatro obj4 = new Cuatro();System.out.println(“obj1.test = “+obj1.test());System.out.println(“obj1.result1 = “+obj1.result1());System.out.println(“obj2.test = “+obj2.test());System.out.println(“obj2.result1 = “+obj3.result1());System.out.println(“obj3.test = “+obj3.test());System.out.println(“obj4.result1 = “+obj4.result1());System.out.println(“obj3.result2 = “+obj3.result2());System.out.println(“obj4.result2 = “+obj4.result2());System.out.println(“obj3.result3 = “+obj3.result3());System.out.println(“obj4.result3 = “+obj4.result3());

}}

¿Quéimprime?

Page 16: Herencia

16

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 31

�������� �� ���� � ���� �

Dibujar()Área()

Perímtetro()

centro

FIGURA

Dibujar()

CUADRILATERO

Dibujar()

CÍRCULO

Perímetro()

CUADRADO

Área()

RECTÁNGULO

Subclases de Figura

SuperclaseSuperclase respecto de CUADRADO Y RECTÁNGULO Redefine la

operación dibujar

Hereda el atributo centro y el método Dibujar() e implementa el método que calcula el área

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 32

�������� �� ���� � ���� �

¿Podría implementar el método Área() y

Perímetro() en la clase Figura?

¿Y en la clase Cuadrilátero?

Page 17: Herencia

17

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 33

�������� �� ����

Del ejemplo anterior se tiene un nuevo concepto .....

Clases AbstractasClases Abstractas

Entonces ...¿Qué son las

clases abstractas?

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 34

�������� �� ���� � ������

#$��������

Se fija un conjunto de métodos y atributos que permitan modelar un cierto concepto, que serárefinado mediante la herencia.

Un método abstracto cuenta con las siguientes características:

• Sólo cuenta con la declaración y no poseen cuerpo de definición• La implementación es específica de cada subclase

Page 18: Herencia

18

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 35

�������� �� ����

public abstract class Figura

{

public Punto centro;

public void mostrarCentro()

{

System.out.println(centro.Imprimir());

}

public abstract double area(); // No tiene implementación

public abstract double perimetro(); // No tiene implementación

}

public class Circulo extends Figura{

static final double PI = 3.141516;protected int radio;

public Circulo(int r) // Constructor {

radio = r;}

public double area(){

return (PI*radio*radio);}

public double perimetro(){

return (2*PI*radio);}

}

public class Triangulo extends Figura{

protected int base, altura;// Constructor

public Triangulo(int x_base, int x_altura){

base = x_base; altura = x_altura;}

public double area(){

return (base*altura/2);}

public double perimetro(){

.....}

}

+ mostrarCentro()+ area()

+ perimetro()

- centro

FIGURA

* radio

CÍRCULO

* base* altura

TRIÁNGULO

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 36

������ #$��������

• Clases cuya descripción es incompleta• No proporcionan la implementación de todos sus métodos (éstos se declaran como abstract).

Las subclases de una clase abstracta DEBEN:

Sobreescribir todos los métodos abstractos de la superclase, o bien, ser declaradas como clases abstractas.

� Una clase abstracta no puede instanciarse

• Una clase con un método abstracto DEBE declararse como clase abstracta, pero ..... Una clase puede declararse como abstracta aunque no tenga ningún método abstracto.

Page 19: Herencia

19

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 37

� �� ��� ������ �$�������

public class usaClaseAbstracta{

public static void main(String args[])

{Figura figura;Triangulo triangulo;Circulo circulo;

double area_triangulo, area_circulo;

figura = new Figura();

triangulo = new Triangulo(29,6);circulo = new Circulo(7);

triangulo.mostrarCentro(); /* Muestra el centro del Triángulo */circulo.mostrarCentro(); /* Muestra el centro del círculo */

/* Calcula las áreas del triángulo y círculo */area_triangulo = triangulo.area();

figura = circulo;

area_circulo = figura.area();

}}

ERROR!!!No se puede

instanciar una clase abstracta

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 38

����� �� %������&

� Una interfaz es un conjunto de declaraciones de funciones.• Una interfaz SÓLO DECLARA COMPORTAMIENTO.• Si una clase implementa (implements) una interfaz, debe definir todas las funciones especificadas por la interfaz..• Permite simular algunos aspectos de la herencia múltiple.

Page 20: Herencia

20

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 39

'���������� �� %���������

interface NombreInterfaz

{

static final tipo NOMBRECONSTANTE = valor;

........

public tipoDevuelto nombreMetodo([lista de parámetros]);

}

class nombreClase implements NombreInterfaz1[, NombreInterfaz2,...]

{

// Declaración atributos y métodos de la clase

}

������������ ��� ������� �� �� ���

�������

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 40

���� � �� %������&

interface Nombrable

{

static final boolean CIERTO = true;

public void mostrarNombre ();

}

public class Elemento implements Nombrable

{

String nombre;

public Elemento(String nom)

{

nombre = nom;

}

/* Obligatorio implementar método mostrarNombre porque se implementa la interfaz Nombrable */

public void mostrarNombre()

{

consola.IO_println(“Nombre = “+nombre);

if (CIERTO) consola.IO_println(“Constante CIERTO del interfaz”);

}

}

Page 21: Herencia

21

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 41

���� �����

� Proviene del griego polymorphos(“muchas formas”).

� A nivel conceptual, se entiende como la posibilidad de emplear la misma expresión para denotar operaciones diferentes.•Ejemplo. Imprimir(texto) –Imprimir(gráfico)

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 42

���� �����

� En la POO el polimorfismo se manifiesta de varias formas:

• Objetos polimórficos

• Sobrecarga de funciones

• Anulación de funciones

• Funciones polimórficas (de argumentos polimórficos)

Page 22: Herencia

22

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 43

���� ����� �� ����

En muchas ocasiones cuando se utiliza Herencia, es posible tener una familia de clases que comparten una interfaz común.

¿En serio? …..

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 44

���� ����� �� ����

public abstract class Mamifero

{

private int numero_patas;

public abstract void mover() ;

}

Una clase ABSTRACTA

‹‹MAMÍFERO››- Numero_patas

+ mover()

Page 23: Herencia

23

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 45

���� ����� �� ����

class Gato extends Mamifero{

public void mover() {

System.out.println(“Un gato moviéndose …."); }

} ‹‹MAMÍFERO››- Numero_patas

+ mover()

GATO

+ mover()

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 46

���� ����� �� ����

class Perro extends Mamifero{

public void mover() {

System.out.println(“Un perro moviéndose …."); }

}

‹‹MAMÍFERO››- Numero_patas

+ mover()

GATO

+ mover()

PERRO

+ mover()

Page 24: Herencia

24

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 47

���� ����� �� ����

public class Polimorfismo {

public static void muevete(Mamifero m) {

m.mover(); } public static void main(String args[]) {

Gato lindo = new Gato(); Perro feo = new Perro(); muevete(lindo); muevete(feo);

} }

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 48

($������� �� � )���

public class Sumar {

public float suma(float a, float b) {

System.out.println("Estoy sumando reales"); return a+b; } public int suma(int a, int b) {

System.out.println("Estoy sumando enteros"); return a+b; } public static void main(String args[]) {

float x = 1, float y = 2; int v = 3, int w = 5; System.out.println(suma(x,y)); System.out.println(suma(v,w));

}

}

Page 25: Herencia

25

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 49

($������� �� � )���

¿La sobrecarga de métodos se puede aplicar a los constructores?