• No se han encontrado resultados

Sesión 20: Herencia 1/2

N/A
N/A
Protected

Academic year: 2022

Share "Sesión 20: Herencia 1/2"

Copied!
48
0
0

Texto completo

(1)

Sesi\'on 20: Herencia 1/2

Programaci\'on 2

\'Angel Herranz 2020-2021

Universidad Polit\'ecnica de Madrid

(2)

En cap\'\i tulos anteriores

- Tema 1: Intro a POO

- Tema 2: Clases y Objetos y TADs y m\'odulos - Tema 3: Colecciones con arrays

- Tema 4: Cadenas simplemente enlazadas / Tema 5: TAD Listas

/ Tema 7: Herencia1 y Polimorfismo

• Ad hoc: mencionaremos sobrecarga

• Gen\'ericos: polimorfismo param\'etrico

1Sólo de interfaz.

(3)

En el cap\'\i tulo de hoy

/ Tema 7: Herencia y Polimorfismo

/ Subtipado: !`empezamos!

(4)

``Un gran poder. . . ''

Stan Lee

(5)

Supongamos que nos regalan listas

2

public class List<T> { public List();

public void add(int i, T e);

public T get(int i);

public int size();

public void remove(int i);

public void remove(T e);

public int indexOf(T e);

}

2Són listas deIntegery sólo se presenta el API, ¿para qué quieres más?

(6)

§ Nos piden implementar conjuntos (c)

public class Set<T> {

public Set() {

}

public void add(T e) {

}

public int size() {

}

public boolean includes(T e) {

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on

(regla has-a)

(7)

§ Nos piden implementar conjuntos (c)

public class Set<T> { private List<T> data;

public Set() {

}

public void add(T e) {

}

public int size() {

}

public boolean includes(T e) {

} }

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on (regla has-a)

Herranz 5

(8)

§ Nos piden implementar conjuntos (c)

public class Set<T> { private List<T> data;

public Set() {

data = new List<T>();

}

public void add(T e) {

}

public int size() {

}

public boolean includes(T e) {

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on

(regla has-a)

(9)

§ Nos piden implementar conjuntos (c)

public class Set<T> { private List<T> data;

public Set() {

data = new List<T>();

}

public void add(T e) {

}

public int size() { return data.size();

}

public boolean includes(T e) {

} }

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on (regla has-a)

Herranz 5

(10)

§ Nos piden implementar conjuntos (c)

public class Set<T> { private List<T> data;

public Set() {

data = new List<T>();

}

public void add(T e) {

}

public int size() { return data.size();

}

public boolean includes(T e) { return data.indexOf(e)!=-1;

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on

(regla has-a)

(11)

§ Nos piden implementar conjuntos (c)

public class Set<T> { private List<T> data;

public Set() {

data = new List<T>();

}

public void add(T e) { if (!this.includes(e))

data.add(0, e);

}

public int size() { return data.size();

}

public boolean includes(T e) { return data.indexOf(e)!=-1;

} }

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Composici\'on (regla has-a)

Herranz 5

(12)

§ Nos piden implementar conjuntos (h)

public class Set<T> extends List<T>

{

public Set() { }

public void add(T e) {

}

public boolean includes(T e) {

} }

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Herencia

(regla is-a)

(13)

§ Nos piden implementar conjuntos (h)

public class Set<T> extends List<T>

{

public Set() { }

public void add(T e) { if (!this.includes(e))

this.add(0, e);

}

public boolean includes(T e) { return this.indexOf(e)!=-1);

} }

public classList<T> { publicList();

public voidadd(int i, T e);

publicT get(int i);

public intsize();

public voidremove(int i);

public voidremove(T e);

public intindexOf(T e);

}

Herencia

(regla is-a)

(14)

Herencia

• Concepto fundamental en OO

• En Java, para empezar:

class A extends B {...}

Las instancias de la clase A tienen todas las propiedades

3

declaradas en B

• Decimos que una clase A hereda de otra clase B

• Tambi\'en decimos que A es subclase de B

• Tambi\'en decimos que B es superclase de A

3Atributos y métodos.

(15)

Herencia

• Concepto fundamental en OO

• En Java, para empezar:

class A extends B {...}

Las instancias de la clase A tienen todas las propiedades

3

declaradas en B

• Decimos que una clase A hereda de otra clase B

• Tambi\'en decimos que A es subclase de B

• Tambi\'en decimos que B es superclase de A

3Atributos y métodos.

(16)

Herencia

• Concepto fundamental en OO

• En Java, para empezar:

class A extends B {...}

Las instancias de la clase A tienen todas las propiedades

3

declaradas en B

• Decimos que una clase A hereda de otra clase B

• Tambi\'en decimos que A es subclase de B

• Tambi\'en decimos que B es superclase de A

3Atributos y métodos.

(17)

Ê Preguntas

• ?`D\'onde est\'a el m\'etodo size en (h)?

• ?`Qu\'e cosas puedo hacer con un conjunto en (c)?

• ?`Y en (h)?

• ?`Es mejor (c) o (h)?

(18)

§ Ejemplo ``tonto''

• Clase Mamífero: comunicar()

Todos los mam\'\i feros se comunican

• Clase Perro: comunicar() y ladrar()

Los perros adem\'as de comunicar, ladran

• Clase Gato: comunicar() y maullar()

Los perros adem\'as de comunicar, maullan

• Programa principal que juegue con objetos de dichas clases4

4Ej. ¿cómo se comunican los mamíferos? ¿puedo hacer que un perro se comunique de una forma especial? ¿y un gato? ¿puedo declarar una variable de tipo mamífero y poner una referencia a un perro? ¿y al revés?

(19)

§

geometria

con herencia

Figura

Circulo

Poligono

PoligonoRegular

Rectangulo

Cuadrado

Triangulo

Equilatero

Hexagono

• Y un programa principal para probar

(20)

!`Aprendiendo!

• Las siguientes transparencias contienen el resultado de un dise\~no colaborativo en clase5

• La idea es que fueran surgiendo necesidades y soluciones a medida que se avanzaba

• La clase comenz\'o con una ``clasificaci\'on'' de las clases por herencia

• Las clases se fueron implementando de arriba a abajo siguiendo el \'arbol de herencia

5Curso 2018-2019.

(21)

Jerarqu\'\i a de herencia

6

6Java no permite herencia múltiple: por ejemplo, no es posible hacer

public class Equilatero extends Triangulo, PoligonoRegular...

(22)

Unified Modelling Language (UML)

• Lenguaje gr\'afico de diagramas (muy orientado a objetos)

• Podemos representar modelos del sistema a construir

• Uno de los diagramas nos permite

representar clases

(23)

§ Empezamos por el top:

Figura

• Damos por supuesta la existencia de la clase

Punto2D (distancia, equals, etc.)

• Todas las figuras tienen un centro

• Todas las figuras tienen un \'area

(24)

Deber\'\i as estar programando. . .

a

ano mirar hasta haberlo intentado por ti mismo

(25)

§ Empezamos por el top:

Figura Deber\'\i as est\'ar programando. . .

package geometria; public class Figura {

private Punto2D centro; public Punto2D centro() {

return this.centro; }

public double area() {

return 0; // ¿Qué otra cosa podemos hacer? }

}

(26)

§ Empezamos por el top:

Figura

Deber\'\i as est\'ar programando. . .

package geometria;

public class Figura { private Punto2D centro;

public Punto2D centro() { return this.centro;

}

public double area() {

return 0; // ¿Qué otra cosa podemos hacer?

} }

(27)

§ Primera subclase:

Circulo

• Todos los c\'\i rculos tienen centro (!`son figuras!)

• Todos los c\'\i rculos tienen \'area (!`son figuras!)

• Todos los c\'\i rculos, adem\'as, tienen un radio

(28)

§ Primera subclase:

Circulo

Deber\'\i as est\'ar programando. . .

package geometria;

public class Circulo extends Figura { private double radio;

public Circulo(Punto2D c, double r) { centro = c;

radio = r; }

}

(29)

§ Primera subclase:

Circulo

Deber\'\i as est\'ar programando. . .

package geometria;

public class Circulo extends Figura { private double radio;

public Circulo(Punto2D c, double r) { centro = c;

radio = r;

} }

(30)

§ Probemos ya:

GeoTest

Deber\'\i as est\'ar programando. . .

import geometria.*; public class GeoTest {

public static void main(String[] argv) {

Circulo c = new Circulo(new Punto2D(0,0), 2.0); assert c.centro().equals(new Punto2D(0,0)); assert Math.abs(c.area() - 4 * Math.PI) < 0.001; }

}

javac -d lib -cp .:lib -sourcepath .:src src/GeoTest.java java -ea -cp lib GeoTest

(31)

§ Probemos ya:

GeoTest

Deber\'\i as est\'ar programando. . .

import geometria.*;

public class GeoTest {

public static void main(String[] argv) {

Circulo c = new Circulo(new Punto2D(0,0), 2.0);

assert c.centro().equals(new Punto2D(0,0));

assert Math.abs(c.area() - 4 * Math.PI) < 0.001;

} }

javac -d lib -cp .:lib -sourcepath .:src src/GeoTest.java java -ea -cp lib GeoTest

(32)

?`Problemillas?

• ?`Alg\'un problema con el constructor de Circulo?

• ?`Quiz\'as con centro?

§ !`Intenta resolverlo como sea!

(33)

?`Problemillas?

• ?`No pasa los tests?

• ?`Quiz\'as el \'area?

§ Deber\'\i as de ser capaz de resolverlo Sobreescribe el m\'etodo área

(34)

Modificador de visibilidad:

protected

Para que una subclase pueda usar una

propiedad de alguna de su supercla-

ses, la propiedad debe etiquetarse al

menos con el modificador

protected

(35)

Clases abstractas

La clase

Figura

no sabe calcular el

\'area de cualquier figura, es demasia-

do abstracta, cuando esto sucede po-

demos marcar el m\'etodo con el mo-

dificador

abstract

(36)

Figura

: clase abstracta

7

+

protected8

package geometria;

public abstract class Figura { protected Punto2D centro;

public abstract double area();

public Punto2D centro() { return centro;

} }

7Métodos sin implementar: serán implementados en las subclases

8

(37)

§ Pruebas con

Figura

Deber\'\i as est\'ar programando. . .

Figura f = new Figura(); assert f.centro() == null;

No es posible crear, directamente,

instancias de clases abstractas

(38)

§ Pruebas con

Figura

Deber\'\i as est\'ar programando. . .

Figura f = new Figura();

assert f.centro() == null;

No es posible crear, directamente,

instancias de clases abstractas

(39)

§ Pruebas con

Figura

Deber\'\i as est\'ar programando. . .

Figura f = new Figura();

assert f.centro() == null;

No es posible crear, directamente,

instancias de clases abstractas

(40)

§

Poligono

• Todos los pol\'\i gonos son figuras

• Los pol\'\i gonos tienen, adem\'as, un n\'umero de lados

• Los pol\'\i gonos tienen, adem\'as, un per\'\i metro

(41)

§

Poligono

Deber\'\i as est\'ar programando. . .

(42)

Poligono

: a\'un es demasiado abstracta

9

package geometria;

public abstract class Poligono extends Figura {

protected int nLados;

public abstract double perimetro();

public int nLados() { return nLados;

} }

9Aún no se puede programararea()y se añadeperimero()que tampoco se sabe cómo implementar

(43)

§

PoligonoRegular

• Todos los pol\'\i gonos regulares son pol\'\i gonos

• Los lados de un pol\'\i gono regular son iguales (longitud del lado)

• Calcular el \'area y el per\'\i metro de un pol\'\i gono regular es ``f\'acil'': !`ya no es abstracta!

(44)

§

PoligonoRegular

Deber\'\i as est\'ar programando. . .

(45)

PoligonoRegular

i

package geometria;

public class PoligonoRegular extends Poligono { protected double longLado;

public PoligonoRegular(Punto2D centro, int nLados, double longLado) { this.centro = centro;

this.nLados = nLados;

this.longLado = longLado;

}

(46)

PoligonoRegular

ii

public double perimetro() { return longLado * nLados;

}

public double lado() { return longLado;

}

public double area() {

double apotema = longLado / (2 * Math.tan(Math.PI/nLados));

return nLados * apotema * longLado / 2;

} }

(47)

§

Hexagono

Deber\'\i as est\'ar programando. . .

(48)

Hexagono

:

super10

+ sobreescritura

11

package geometria;

public class Hexagono extends PoligonoRegular {

public Hexagono(Punto2D centro, double longLado) { super(centro, 6, longLado);

}

public double area() {

return 3 * Math.sqrt(3) * longLado * longLado / 2;

} }

10Reusando el constructor del padre

Referencias

Documento similar

22 Enmarcado el proyecto de investigación de I+D «En clave femenina: música y ceremonial en las urbes andaluzas durante el reinado de Fernando VII (1808-1833)» (Plan Andaluz

Pero, al fin y al cabo, lo que debe privar e interesar al sistema, es la protección jurisdiccional contra las ilegalidades de la Administración,221 dentro de las que se contemplan,

a) Ao alumnado que teña superado polo menos 60 créditos do plan de estudos da licenciatura que inclúan materias troncais e obrigatorias do primeiro curso recoñeceráselles o

public class TestFrameworkClassLoader extends URLClassLoader{. private static

Imparte docencia en el Grado en Historia del Arte (Universidad de Málaga) en las asignaturas: Poéticas del arte español de los siglos XX y XXI, Picasso y el arte español del

De esta manera, ocupar, resistir y subvertir puede oponerse al afrojuvenicidio, que impregna, sobre todo, los barrios más vulnerables, co-construir afrojuvenicidio, la apuesta

Si el progreso de las instituciones de Derecho público no ha tenido lugar en los pueblos que se han reservado para el Poder judicial en abso- luto las

Tal como se ha expresado en El Salvador coexisten dos tipos de control de constitucionalidad: el abstracto y el concreto. Sobre ambos se ha proporcionado información que no precisa