11
POO en Java IV: Herencia POO en Java IV: Herencia Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile f d@ l fguidi@ucv.cl Actualización: 17 de noviembre de 2010 Herencia Es la derivación de una clase a partir de otra existente. El objetivo es la reutilización del software desarrollado. Herencia Herencia Franco Guidi Polanco 2 Superclases y subclaases Una clase derivada de otra clase recibe también el nombre de subclase o clase hija. La clase de la cual se deriva una subclase se denomina clase base, superclase o clase padre. Vehículos de carga Superclase Clase base Clase padre Camión Clase padre Subclase Clase derivada La herencia aplica en relaciones de naturaleza B es un Camión Clase derivada Clase hija Franco Guidi Polanco 3 La herencia aplica en relaciones de naturaleza B es un tipo de AHerencia simple Una clase es subclase de una única superclase. Vehículos de carga C Camn Franco Guidi Polanco 4

Java POO 4 Herencia

  • Upload
    admh192

  • View
    26

  • Download
    3

Embed Size (px)

Citation preview

  • POO en Java IV: HerenciaPOO en Java IV: Herencia

    Franco Guidi PolancoEscuela de Ingeniera Industrial

    Pontificia Universidad Catlica de Valparaso, Chilef d @ [email protected]

    Actualizacin: 17 de noviembre de 2010

    Herencia

    Es la derivacin de una clase a partir de otra existente.El objetivo es la reutilizacin del software

    desarrollado.

    HerenciaHerencia

    Franco Guidi Polanco 2

    Superclases y subclaases

    Una clase derivada de otra clase recibe tambin el nombre de subclase o clase hija.

    La clase de la cual se deriva una subclase se denomina clase base, superclase o clase padre.

    Vehculos de cargaSuperclaseClase baseClase padre

    Camin

    Clase padre

    SubclaseClase derivada

    La herencia aplica en relaciones de naturaleza B es un

    Camin Clase derivadaClase hija

    Franco Guidi Polanco 3

    La herencia aplica en relaciones de naturaleza B es un tipo de A

    Herencia simple

    Una clase es subclase de una nica superclase.

    Vehculos de carga

    C iCamin

    Franco Guidi Polanco 4

  • Herencia mltiple

    Una clase es subclase de ms de una superclase.

    Vehculos t t

    Vehculos titerrestres acuticos

    Vehculos anfibios

    Java no soporta la herencia mltiple.

    Franco Guidi Polanco 5

    Jerarquas de Herencia

    La herencia organiza clases bases y derivadas

    Pen jerarquas de clases.Una subclase hereda

    Persona

    propiedades de la respectiva superclase.

    b l d

    Alumno Profesor

    Una subclase, respecto de su superclase:

    Agrega nuevas propiedades

    Profesorhora

    Alumnopregrado

    Alumno magster

    Agrega nuevas propiedades Modifica propiedades

    heredadas

    Franco Guidi Polanco 6

    Implementacin de jerarquas de herencia

    Ejemplo:

    Persona Atributos:- RUTOperaciones:

    -set y get RUT- RUT- Nombre

    -set y get RUT- set y get Nombre

    AlumnoAtributos:

    - RUTOperaciones:

    -set y get RUTAlumno- Nombre- Rol UCV

    - set y get Nombre- set y get Rol UCV

    Franco Guidi Polanco 7

    Implementacin de jerarquas de herencia

    Para crear una subclase a partir de una superclase, la subclase debe declararse:

    public class NombreSubclase extends NombreSuperclase

    Franco Guidi Polanco 8

  • Implementacin de jerarquas de herencia

    public class Persona { public class Alumno extends Persona {public class Persona {private String rut;private String nombre;

    public class Alumno extends Persona {private String rolUCV;public Alumno() {

    public Persona() {rut = "00000000-0";nombre = ""; }

    public void setRut(String r){t }

    rolUCV = 000000-0";}public void setRolUCV(String r){

    rolUCV = r; }bli St i tR lUCV(){rut = r; }

    public String getRut(){return rut; }

    public void setNombre(String n){nombre = n; }

    public String getRolUCV(){return rolUCV; }

    }nombre = n; }

    public String getNombre(){return nombre; }

    }

    Franco Guidi Polanco 9

    Superclase Subclase

    Miembros heredados

    Una subclase hereda de su superclase (por el momento): Variables de instancia pblicas Mtodos pblicos

    Todos los anteriores pueden ser utilizados en la b l i h bi id d l dsubclase como si hubieran sido declarados en

    ella.

    Franco Guidi Polanco 10

    Miembros no heredados

    Una subclase no hereda: Propiedades privadasPropiedades privadas Constructores

    Sin embargo es posible hacer un uso indirecto de ellos Variables definidas Invocacin al constructor de la superclase.

    Franco Guidi Polanco 11

    Miembros no heredados: Variables definidas

    Las variables privadas no son heredadas, por lo que no pueden aparecer en el cdigo de la subclase.

    Sin embargo se puede hacer uso indirecto de ellas a travs de los mtodos pblicos de la superclase.

    Se dice que estas variables se encuentran definidas en la Se dice que estas variables se encuentran definidas en la subclase.

    Franco Guidi Polanco 12

  • Miembros no heredados: Variables definidas (cont.)

    Ejemplo incorrecto:public class Persona { public class Alumno extends Persona {

    Variables definidas en Alumnopublic class Persona {private String rut;private String nombre;

    public class Alumno extends Persona {private String rolUCV;public Alumno() {

    public Persona() {rut = "00000000-0";nombre = ""; }

    public void setRut(String r){t }

    rolUCV = 000000-0";}public void setRolUCV(String r){

    rolUCV = r; }bli St i tR lUCV(){rut = r; }

    public String getRut(){return rut; }

    public void setNombre(String n){nombre = n; }

    public String getRolUCV(){return rolUCV; }

    public String quinSoy(){return rut + nombre + rolUCV;nombre = n; }

    public String getNombre(){return nombre; }

    }

    return rut + nombre + rolUCV;}

    }

    Franco Guidi Polanco 13

    Error: no pueden ser accesadas directamente

    Miembros no heredados: Variables definidas (cont.)

    Ejemplo correcto:public class Persona { public class Alumno extends Persona {public class Persona {private String rut;private String nombre;

    public class Alumno extends Persona {private String rolUCV;public Alumno() {

    public Persona() {rut = "00000000-0";nombre = ""; }

    public void setRut(String r){t }

    rolUCV = 000000-0";}public void setRolUCV(String r){

    rolUCV = r; }bli St i tR lUCV(){rut = r; }

    public String getRut(){return rut; }

    public void setNombre(String n){nombre = n; }

    public String getRolUCV(){return rolUCV; }

    public String quinSoy(){return getRut() + getNombre()nombre = n; }

    public String getNombre(){return nombre; }

    }

    return getRut() + getNombre()+ rolUCV;

    }}

    Franco Guidi Polanco 14

    Esto s funciona

    Miembros no heredados: Constructores

    Los constructores no son heredados, por lo que cada subclase debe tener su(s) propio(s) constructor(es). Sin embargo en los constructores se puede invocar

    al constructor de la superclase con la instruccin:

    super( lista parmetros )

    La instruccin super debe ser la primerainstruccin del constructor.

    Franco Guidi Polanco 15

    Constructores: la verdad parcial

    Todo subclase debe incluir una referencia super a algn constructor de la superclase.

    Si no se incluye la referencia super, Java incluye automticamente una referencia al constructor sinautomticamente una referencia al constructor sin parmetros de la superclase. Es decir incluye:

    super()

    Notar que se produce un error cuando no existe un constructor sin parmetros en la superclase y se omite laconstructor sin parmetros en la superclase y se omite la referencia super en la subclase por qu?

    Franco Guidi Polanco 16

  • Constructores y herencia

    Dos clases equivalentes:public class Alumno extends

    Persona {private String rolUCV;

    public class Alumno extendsPersona {

    private String rolUCV;public Alumno() {

    rolUCV = 000000-0";}

    public Alumno() {super();rolUCV = 000000-0";

    }public void setRolUCV(String r){

    rolUCV = r; }public String getRolUCV(){

    return rolUCV; }

    }public void setRolUCV(String r){

    rolUCV = r; }public String getRolUCV(){

    return rolUCV; }public String quinSoy(){

    return getRut() + getNombre() + rolUCV;

    }

    public String quinSoy(){return getRut() + getNombre()

    + rolUCV;}

    Franco Guidi Polanco 17

    }}

    }}

    Constructores y herencia

    Qu pasa en este caso?public class Persona {private String rut;private String nombre;

    public class Alumno extendsPersona {

    private String rolUCV;public Persona(String r, String n) {

    rut = r;nombre = n;

    }

    public Alumno() {super( 000000-0, N/A );rolUCV = 000000-0";

    }}public void setRut(String r){

    rut = r; }public String getRut(){

    return rut; }

    }public void setRolUCV(String r){

    rolUCV = r; }public String getRolUCV(){

    public void setNombre(String n){nombre = n; }

    public String getNombre(){return nombre; }

    return rolUCV; }public String quinSoy(){

    return getRut() + getNombre() l

    Franco Guidi Polanco 18

    }+ rolUCV;

    }}

    Constructores y herencia: Atencin!

    Qu pasa en el siguiente caso?public class Persona {private String rut;private String nombre;

    public class Alumno extendsPersona {

    private String rolUCV;public Persona(String r, String n) {

    rut = r;nombre = n;

    }

    public Alumno() {rolUCV = 000000-0";

    }}public void setRut(String r){

    rut = r; }public String getRut(){

    return rut; }

    public void setRolUCV(String r){rolUCV = r; }

    public String getRolUCV(){return rolUCV; }

    public void setNombre(String n){nombre = n; }

    public String getNombre(){return nombre; }

    public String quinSoy(){return getRut() + getNombre()

    + rolUCV;}

    Franco Guidi Polanco 19

    }}

    }

    Herencia: la verdad total

    En Java toda clase extiende otra clase.Las clases que no declaran extender a otras,Las clases que no declaran extender a otras,

    extienden a la clase Object.Object es la superclase (directa o indirecta) de j p ( )

    todas las clases.Todas las clases son subclases de Object o de otra

    subclase.

    Por lo tanto: todos los constructores incluyen (explcitamente o no) una referencia al constructor de su superclase.

    Franco Guidi Polanco 20

    superclase.

  • Sobreescritura de mtodos

    Un mtodo declarado e implementado en una sperclase puede ser reimplementado en una subclase. Esto se d i b it d t ddenomina sobreescritura de mtodos.

    Conceptualmente significa que la subclase realiza la operacin de la sper clase, pero de un modo distinto.operacin de la sper clase, pero de un modo distinto.

    Esto es un caso de polimorfismo. public class Persona {

    i S ipublic class Alumno extends

    P {private String rut;private String nombre;public String getRut(){

    return rut; }public String getNombre(){

    Persona {private String carrera;

    public String identificarse(){public String getNombre(){return nombre; }

    public String identificarse(){return rut + nombre;

    }

    public String identificarse(){return getRut() + getNombre()

    + carrera;}

    Franco Guidi Polanco 21

    }//otros miembros de la clase}

    //otros miembros de la clase}

    Sobreescritura de mtodos

    public class Persona {private String rut, nombre;public Persona(String r, String n){

    rut = r; nombre = n;

    public class Alumno extendsPersona {

    private String carrera;public Alumno(String r, String ; ;

    }public String getRut(){ return rut;}public String getNombre(){

    return nombre;}

    p ( g , gn, String c){

    super(r,n); carrera = c;}public String identificarse(){

    public String identificarse(){return rut + nombre;

    }}

    return getRut() + getNombre() + carrera;

    }}

    Qu ocurre en las siguientes situaciones?Persona a new Persona(100 Matas)Persona a = new Persona(100, Matas);System.out.println( a.identificarse() ); Alumno a = new Alumno(100, Matas, Ind);S t t i tl ( id tifi () )

    100Matas

    100M t I d

    Franco Guidi Polanco 22

    System.out.println( a.identificarse() ); 100MatasInd

    Sobreescritura de mtodos

    public class Persona {private String rut, nombre;public Persona(String r, String n){

    rut = r; nombre = n;

    public class Alumno extendsPersona {

    private String carrera;public Alumno(String r, String ; ;

    }public String getRut(){ return rut;}public String getNombre(){

    return nombre;}

    p ( g , gn, String c){

    super(r,n); carrera = c;}public String identificarse(){

    public String identificarse(){return rut + nombre;

    }}

    return getRut() + getNombre() + carrera;

    }}

    Y qu ocurre aqu?Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );

    Franco Guidi Polanco 23

    Sobreescritura de mtodos

    public class Persona {private String rut, nombre;public Persona(String r, String n){

    rut = r; nombre = n;

    public class Alumno extendsPersona {

    private String carrera;public Alumno(String r, String ; ;

    }public String getRut(){ return rut;}public String getNombre(){

    return nombre;}

    p ( g , gn, String c){

    super(r,n); carrera = c;}public String identificarse(){public String identificarse(){

    public String identificarse(){return rut + nombre;

    }}

    return getRut() + getNombre() + carrera;

    }}

    return getRut() + getNombre() + carrera;

    }

    Y qu ocurre aqu?Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );

    100MatasInd

    Franco Guidi Polanco 24

    Java resuelve en tiempo de ejecucin la asociacin entre la variable y el mtodo que debe invocar, en funcin del objeto que se encuentre referenciado en ella.

  • Sobreescritura de mtodos

    Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );

    El compilador Java es responsable de verificar que el mtodo pertenezca al tipo de dato declarado por la variable.l bl d d fEl intrprete Java es responsable de identificar y

    ejecutar la implementacin del mtodo correspondiente al tipo de objeto referenciado encorrespondiente al tipo de objeto referenciado en el momento por la variable.

    Franco Guidi Polanco 25

    Reconocimiento de clases: operador instanceof

    El operador instanceof permite reconocer la clase a la que pertenece un objeto referenciado desde unala que pertenece un objeto referenciado desde una variable determinada.Formato:Formato:

    NombreVar instanceof NombreClaseEjemplo:Ejemplo:

    if( pers instanceof Persona )System.out.println( La variable pers referencia a una Persona );y p ( p );

    elseSystem.out.println( La variable pers no referencia a una Persona );

    Franco Guidi Polanco 26

    Operador instanceof y herencia

    Todo objeto es instancia de la clase a la que pertenece, como tambin instancia de supertenece, como tambin instancia de su superclase.

    Electrodomstico

    Lavadora

    Un objeto de la clase lavadora es tambin un electrodomstico

    Franco Guidi Polanco 27

    Operador instanceof: ejemplo Suponer:

    Persona

    Persona p1 =null:Profesor p2 = new Profesor();Alumno p3 = new Alumno();

    Profesor Alumno

    if( p1 instanceof Persona ) --> falseif( p2 instanceof Profesor ) --> trueif( 3 i t f Al ) tProfesor Alumno if( p3 instanceof Alumno ) --> trueif( p2 instanceof Alumno ) --> falseif( p3 instanceof Persona ) --> trueif( p2 instanceof Persona ) > trueif( p2 instanceof Persona ) --> true

    Franco Guidi Polanco 28

  • Herencia y acceso a miembros de una clase

    public class Persona {private String rut;private String nombre;public setDatos(String r String n) {

    public class Alumno extendsPersona {

    private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }

    public String getRut(){return rut; }

    private String carrera;

    public String matricularse(String c){

    carrera = c;public String getNombre(){

    return nombre; }}

    }

    }

    Persona a = new Persona(); Esto debe funcionar:Persona a new Persona();a.setDatos( 1000-2, Luis);Alumno b = new Alumno();b tD t ( 2000 3 P l )

    Franco Guidi Polanco 29

    b.setDatos( 2000-3, Pamela );b.matricularse( Industrial );

    Herencia y acceso a miembros de una clase

    public class Persona {private String rut;private String nombre;public setDatos(String r String n) {

    public class Alumno extendsPersona {

    private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }

    public String getRut(){return rut; }

    private String carrera;

    public String matricularse(String c){

    carrera = c;public String getNombre(){

    return nombre; }}

    }

    }

    Esto funciona? Error: el compiladordetermina que este mtodo no pertenece a Persona. SinPersona c = new Alumno(); no pertenece a Persona. Sin embargo la variable contiene referencia a un Alumno, que es un tipo de Persona (y que posee

    t t d )

    Persona c new Alumno();c.setDatos( 1000-2, Luis);c.matricularse( Comercial );

    Franco Guidi Polanco 30

    este mtodo).

    Herencia y acceso a miembros de una clase

    public class Persona {private String rut;private String nombre;public setDatos(String r String n) {

    public class Alumno extendsPersona {

    private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }

    public String getRut(){return rut; }

    private String carrera;

    public String matricularse(String c){

    carrera = c;public String getNombre(){

    return nombre; }}

    }

    }

    Es necesario introducir un casting para indicar al compilador que el objeto referenciado en la variable es efectivamente una instancia de Alumno:efectivamente una instancia de Alumno:

    Persona c = new Alumno();c setDatos( 1000-2 Luis);

    Franco Guidi Polanco 31

    c.setDatos( 1000 2 , Luis );( (Alumno)c ).matricularse( Industrial );

    Herencia y acceso a miembros de una clase

    El casting no convierte objetos, simplemente explicita el tipo de objeto referenciado en una variable.

    Persona Persona a = new Profesor();Profesor b = (Profesor) a; // OKAlumno c = (Alumno) a; // ERROR

    Profesor Alumno Persona d = new Persona();Profesor e = (Profesor) d; // ERRORAlumno f = (Alumno) d; // ERROR

    Alumno g = new Alumno();Profesor h = (Profesor) g; // ERROR

    Franco Guidi Polanco 32

  • Miembros protegidos de una clase

    El modificador de visibilidad protected, permite declarar visibilidad protegida en variables de instancia y mtodos.Los miembros de una clase con visibilidad

    protegida son slo accesibles desde la misma claseo desde cualquier subclase de ella (no son accesibles desde otras clases)accesibles desde otras clases).

    Franco Guidi Polanco 33

    Miembros protegidos de una clase

    Por lo tanto, una subclase hereda de su superclase: Variables de instancia protegidas y pblicas Mtodos protegidos y pblicos

    Franco Guidi Polanco 34

    Miembros protegidos de una clase

    Ejemplo:public class Persona { public class Alumno extendsprotected String rut;protected String nombre;public Persona(String r String n) {

    Persona {private String rolUCV;bli Al () {public Persona(String r, String n) {

    rut = r;nombre = n;

    }public void setRut(String r){

    public Alumno() {super( 000000-0, N/A );rolUCV = 000000-0";

    }pub c o d set ut(St g ){

    rut = r; }public String getRut(){

    return rut; }public void setNombre(String n){

    public String quinSoy(){return rut + nombre

    + rolUCV;}

    nombre = n; }public String getNombre(){

    return nombre; }}

    }

    Franco Guidi Polanco 35

    }

    Identificacin de superclases

    Contexto: se est desarrollando una aplicacin que trabaja con CDs, DVDs y discos de vinilo.

    Problema: se establece que a pesar de tener sus propios atributos, todos ellos disponen de di ll di fi t ProductoMusicalcdigo, sello discogrfico y autor.

    Se desea evitar duplicidad de cdigo.

    ProductoMusicalcdigosello autor Decisin: se determina la

    conveniencia de crear la clase ProductoMusical, que agrupa las propiedades comunes de los tres Vi ilDVDCD

    autor

    propiedades comunes de los tres tipos de productos. ViniloDVDCD

    Franco Guidi Polanco 36

    La superclase aparece por factorizacin de propiedades comunes

  • Clases abstractas

    En el ejemplo anterior la clase ProductoMusical es abstracta (no representa entidades presentes en el dominio).

    Esta condicin se explicita en el diseo declarando la clase como Esta condicin se explicita en el diseo, declarando la clase como abstracta.

    ProductoMusical public abstract class ProductoMusical {ProductoMusical{abstract}

    cdigosello

    private int cdigo;private String sello;

    sello autor

    ...}

    Una clase abstracta no puede ser instanciada ha sido diseada slo

    ViniloDVDCD

    Una clase abstracta no puede ser instanciada, ha sido diseada slo para ser extendida.

    Franco Guidi Polanco 37

    Clases abstractas

    Otro ejemplo: un software trabaja con distintas figuras geomtricas, todas ellas polgonos, con

    algunas propiedades en comn (ej. cantidad de lados).

    Polgono

    Franco Guidi Polanco 38

    Clases abstractas

    public abstract class Poligono {protected int lados;public void setLados(int l){public void setLados(int l){

    lados = l;}...

    Polgono

    }

    public class Cuadrado extends Poligono {private int longitud; public void setLongitud(double l) {public void setLongitud(double l) {

    longitud = l;}...

    Franco Guidi Polanco 39

    }

    Mtodos abstractos

    Supongamos que en el ejemplo anterior todos los polgonos deben proveer un mtodo de clculo de reaproveer un mtodo de clculo de rea.

    Conflicto de fuerzas en diseo: Todos los polgonos deben proveer el

    Polgono

    mtodo, por lo tanto debiese aparecer a nivel de la superclase Polgono.

    La operacin del mtodo depende de cada polgono concreto (ej. rea de cuagrado: lado2, rea de tringulo base * altura /2, etc.), por lo tanto no puede establecerse

    l i i l d luna lgica comn a nivel de superclase.

    Solucin: declarar mtodo como abstracto en la superclase.abst acto e a supe c ase

    Franco Guidi Polanco 40

  • Mtodos abstractos

    Un mtodo abstracto es un mtodo que se declaraen una superclase, pero sin proveer implementacin.La implementacin de un mtodo abstracto se

    difiere para sus subclases.Una clase que declara uno o ms mtodos

    b b ( d babstractos es necesariamente abstracta (y debe ser declarada como tal).Si b l i l t iSi una subclase no provee implementacin para un

    mtodo abstracto que hereda de su superclase, es necesariamente abstracta (y debe ser declaradanecesariamente abstracta (y debe ser declarada como tal).

    Franco Guidi Polanco 41

    Mtodos abstractos

    public abstract class Poligono {protected int lados;public int setLados(int l){

    l d llados = l;}public abstract double getArea();...Polgono

    }

    public class Cuadrado extends Poligono {public class Cuadrado extends Poligono {private double longitud;public void setLongitud(double l) {

    longitud = l;}public double getArea(){

    return longitud*longitud;}

    Franco Guidi Polanco

    42

    }...

    }

    Consecuencias del uso de mtodos abstractos

    Si una superclase declara algn mtodo abstracto, entonces:abstracto, entonces: Las subclases concretas deben implementarlo. Las variables de referencia declaradas del tipo Las variables de referencia declaradas del tipo

    de la superclase pueden recibir invocaciones al mtodo abstracto, sin necesidad de casting. , gEjemplo:

    Polgono figura = new Tringulo(); getArea() fuePolgono figura new Tringulo();

    double sup = figura.getArea();

    getArea() fue declarado como mtodo abstracto en Polgono.

    Franco Guidi Polanco 43