Está en la página 1de 19

Herencia

Ing. Andrea Quan

Herencia
Clases tienen la capacidad de heredar caractersticas de otras clases Caractersticas: Campos y mtodos (incluyendo constructores) Extender una clase Reutilizacin cdigo a nivel de definicin de tipos de objetos Clase Padre superclase (base class) Clase Hijo subclase (derived class)

Ejemplo: clase TailList


Recordemos la clase SList. Queremos mejorar esta clase agregando un puntero que haga referencia al ltimo nodo de la lista(tail). Para esto utilizaremos herencia y crearemos una nueva clase TailList que herede las propiedades de la SList, pero que tenga este puntero adicional.

Ejemplo: Clase TailList


public class TailList extends SList {

Ejemplo: Clase TailList


public class TailList extends SList {
- Clase TailList extiende a la clase SList - Clase TailList hereda las propiedades de SList

La clase TailList es subclase de SList La clase SList es superclase de TailList

Herencia
Una subclase puede modificar o extender una superclase en por lo menos tres formas
(1) Declarando nuevos campos (2) Declarando nuevos mtodos (3) Sobrescribiendo mtodos heredados con nuevas implementaciones.

Ejemplo: Clase TailList


public class TailList extends SList { /* los campos head y size son heredados */ private SNode tail; Agregamos un campo SNode tail que apuntar al ltimo nodo de la lista simple.
Instancia de SList size head Instancia de TailList size head tail

Constructores
public size head tail } TailList() { = 0; /* Instrucciones del = null; constructor de SList */ = null;

Constructores
public size head tail } TailList() { = 0; /* Instrucciones del = null; constructor de SList */ = null;

public TailList() { super(); tail = null;

/* llamada al constructor de SList */

} IMPORTANTE: La llamada a super DEBE ser la primera en el constructor

Ejemplo: Clase TailList


Podemos sobrescribir el mtodo insertEnd, ya que ahora tenemos una referencia al ltimo nodo:
public void insertEnd (Object dato) { SNode nuevo = new SNode(dato); if (!this.isEmpty()) { tail.next = nuevo; tail = tail.next; size++; } else { head = tail = nuevo; size = 1; } }

super.
Adems de utilizarlo como llamada al constructor de la superclase, super puede ser utilizado para hacer referencia a mtodos de la superclase.
public void insertFront(Object dato) { super.insertFront(dato); if (size == 1) { tail = head; } }
Llama a ejecutar al metodo insertFront de la superclase

protected
protected es un nivel de proteccin entre public y private Un campo o mtodo protected es visto por la clase y por todas sus subclases, pero no por otras clases. Un campo private no es visible para ninguna clase, ni siquiera para las subclases y por lo tanto no puede ser heredado.

Protected
public class SList { private SNode head; private int size; [ implementacin de constructores y mtodos ] } public class SList { protected SNode head; protected int size; [ implementacin de constructores y mtodos ] }

Variables y Referencias
Las variables de tipo superclase pueden hacer referencia a objetos de tipo subclase, pero no al revs.
Object o = new Integer(1); Object o = Hola; SList s = new TailList(); //BIEN! //ERROR!

TailList t = new SList();

Dynamic Method Lookup


Una variable tiene dos tipos de dato: l Tipo esttico (static type): Tipo con el que la variable se declar. l Tipo dinmico (dynamic type): Tipo del objeto al que la variable hace referencia en un instante determinado. Object o = Hola; Tipo esttico Object Tipo dinmico String

Dynamic Method Lookup


Object o = new Integer(2); o.toString(); devuelve 2 SList s = new TailList(); s.insertEnd(dato); s.size(); // mtodo de TailList // mtodo de SList

SList s = new SList(); s.insertEnd(dato); // mtodo de SList

Herencia
Los mtodos propios de una subclase no pueden ser llamados desde una variable de tipo superclase
Object o = new Integer(3); o.intValue(); //ERROR! TailList t = new TailList(); t.metodoTailList(); s.metodoTailList(); //BIEN!! //ERROR!! SList s = new TailList();

Herencia
Aqu se aplica el uso de CASTING
SList s = new SList(); TailList t = new TailList(); s = t; TailList x = s; x = (TailList)s; //BIEN! //ERROR! //BIEN!

instanceof
Object o = Hola; Integer i = (Integer)o; //ClassCastException if (o instanceof Integer) { Integer i = (Integer)o; //BIEN! } s = new SList(); t = (TailList)s; //ClassCastException if (s instanceof TailList) { t = (TailList)s; //BIEN }

También podría gustarte