Sei sulla pagina 1di 28

Programacin Orientada a Objetos en Java

Unidad 3 Herencia y Polimorfismo

Temario

Herencia Reescritura de mtodos Polimorfismo Clases abstractas Interfaces

Herencia

In object-oriented programming (OOP), Inheritance is a way to compartmentalize and reuse code by creating collections of attributes and behaviors called objects which can be based on previously created objects. In classical inheritance where objects are defined by classes, classes can inherit other classes. The new classes, known as Sub-classes (or derived classes), inherit attributes and behavior of the pre-existing classes, which are referred to as Super-classes (or ancestor classes). The inheritance relationship of sub- and superclasses gives rise to a hierarchy. In Prototype-based programming objects can be defined directly from other objects without the need to define any classes. The inheritance concept was invented in 1967 for Simula.

Wikipedia

Herencia en Java

Todas las clases son descendientes de la clase Object La clusula extends especifica el ancestro inmediato de la clase Una subclase o clase derivada hereda todos los campos y mtodos de la superclase o clase base Java soporta herencia simple (slo una clase base)
ancestro superclase clase base "hereda de" "extiende" "is a"

descendientes subclases clases derivadas


4

Ejemplo
class Figura { int x, y; public void print() { ... } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } }

La clase Circulo es derivada de la clase base Figura

class Rectangulo extends Figura { int largo, ancho; public void setLargo(int largo) { this.largo = largo; } public void setAncho(int ancho) { this.ancho = ancho; } } class App { void f() {

Rectangulo r = new Rectangulo();


r.setX(10); r.setY(20); r.setAncho(100); r.setLargo(300); } }

La clase Circulo hereda mtodos setX y setY de clase base Figura

Encapsulamiento

Una clase derivada tiene acceso a los miembros public y protected de una clase base, aunque pertenezcan a paquetes diferentes Una clase derivada tiene acceso a los miembros package de una clase base si ambas clases pertenecen al mismo paquete

Una clase derivada no tiene acceso a los miembros private de una clase base
6

Polimorfismo

Polymorphism, in the context of object-oriented programming, is the ability of one type, A, to appear as and be used like another type, B. The purpose of polymorphism is to implement a style of programming called message-passing in the literature, in which objects of various types define a common interface of operations for users. In strongly typed languages, polymorphism usually means that type A somehow derives from type B, or type C implements an interface that represents type B. In weakly typed languages types are implicitly polymorphic.

Wikipedia
7

Polimorfismo
Circulo circulo; circulo = new Circulo(); Figura figura; figura = circulo;

circulo figura

Compila y ejecuta bien (un crculo es una figura) Restriccin: no se puede usar figura para acceder a mtodos especializados de Circulo
figura.getRadio(); // no compila

Polimorfismo

Java permite asignar un objeto a una variable declarada con un tipo de datos ancestro
void metodo1(Figura f) { f.print(); ...

}
void metodo2() { metodo1(new Circulo()); }
9

Reescritura de Mtodos

Method overriding, in object oriented programming, is a language feature that allows a subclass or child class to provide a specific implementation of a method that is already provided by one of its superclasses or parent classes. The implementation in the subclass overrides (replaces) the implementation in the superclass by providing a method that has same name, same parameters or signature, and same return type as the method in the parent class.The version of a method that is executed will be determined by the object that is used to invoke it. If an object of a parent class is used to invoke the method, then the version in the parent class will be executed. If an object of the subclass is used to invoke the method, then the version in the child class will be executed.
Wikipedia

10

Reescritura de Mtodos
public class DTE { ... public void validar() { ... } } public class Factura extends DTE public void validar() { super.validar(); ... } }

{
Reescritura del mtodo validar() en clase derivada (la firma y el tipo de retorno coinciden con los de la clase base)

Invocacin a funcionalidad provista en la clase base, para extender en lugar de reemplazar


11

Dynamic Binding

Al invocar un mtodo no static, el tipo real del objeto sobre el que se invoca el mtodo y no el tipo de la referencia es utilizado para determinar qu versin del mtodo invocar El tipo del objeto sobre el que se invoca el mtodo se obtiene en tiempo de ejecucin, por eso esta funcionalidad recibe el nombre de dynamic binding, o late binding
void procesarDTE(DTE dte) { dte.validar(); Dynamic binding: invoca a ... Factura.validar() si dte es una } referencia a una Factura
12

Compatibilidad de Tipos

Java es fuertemente tipeado, exige compatibilidad de tipos en tiempo de compilacin:

Permite asignar un objeto a una variable de un tipo ancestro Permite asignar un objeto a una variable de un tipo descendiente, pero exige que se explicite este uso, mediante un cast (si el cast falla en ejecucin, la mquina virtual lanza un ClassCastException)
Factura factura = (Factura) dte;

No permite realizar una conversin de un objeto a un tipo que no es ancestro ni descendiente


13

Identificacin de Tipo

El mtodo getClass de la clase Object retorna un objeto de tipo Class correspondiente a la clase real a la que pertenece el objeto El operador instanceof indica si un objeto es de una clase determinada o de alguna clase descendiente
if (dte instanceof Factura) { Factura factura = (Factura) dte; // uso de factura }
Ojo, no abusar de este mecanismo! (hacerlo significa que se est programando de manera tradicional, sin obtener los beneficios de la OOP)

14

Constructor en Subclases

El constructor de una subclase debe invocar algn constructor de la clase base:


Explcitamente: usando base() Implcitamente: si no se invoca el constructor de la clase base explcitamente, se invoca el constructor default
class DTE { DTE(Empresa emisor, int folio) { ... } ... } class Factura extends DTE { Factura(Empresa emisor, int folio, Empresa receptor) { super(emisor, folio); ... } ... }

15

Ejemplo

Se desea construir una aplicacin que permita manejar mltiples ventanas, con diferentes tipos de documentos: cartas, memos, etc. El sistema debe permitir que se imprima la ventana activa, mediante la opcin de men File/Print

16

Ejemplo: Diseo con Polimorfismo


public class Documento { public void print() {...} } public class Carta extends Documento { public void print() {...} }

public class Memo extends Documento { public void print() {...} }


public class MiAplicacion { public void print() { Window w = GUI.getCurrentWindow(); Documento d = obtenerDocumento(w); d.print(); Dynamic binding: se invoca al mtodo print } implementado en la clase del objeto referenciado por la }

variable d, el cual se determina en ejecucin

17

Consideraciones de Diseo

Supongamos que en el diseo anterior, la clase Documento no debe instanciarse, slo se ha creado para construir una jerarqua de clases y hacer uso de los mecanismos de polimorfismo y dynamic binding; cmo impedir que por error se instancie la clase Documento? Supongamos que en el diseo anterior las clases derivadas de Documento deben proveer una implementacin del mtodo print() (no tiene sentido programar una implementacin default en la clase Documento); cmo obligar a las clases derivadas a proveer una implementacin del mtodo print()?

18

Clases Abstractas

Una clase abstracta no puede ser instanciada Puede contener mtodos abstractos, a ser implementados en subclases Puede contener mtodos concretos
public abstract class Documento { ... public abstract void print(); }

Clase Documento es abstracta: si se intenta instanciarla, se produce un error de compilacin

public class Carta extends Documento { public void print() { Si la clase Carta no provee ... una implementacin del } mtodo print(), se produce un }

error de compilacin

Una subclase de una clase abstracta debe:

implementar todos los mtodos abstractos heredados, o bien ser a su vez declarada abstracta

19

Java No Soporta Herencia Mltiple

En ocasiones es til que una clase se pueda ver de varias formas, utilizando polimorfismo En C++, lo anterior se implementa con herencia mltiple, pero esto genera problemas cuando se hereda implementacin Para evitar estos problemas, Java no soporta herencia mltiple, pero s permite que una clase implemente mltiples interfaces

20

Interfaces

In object-oriented languages the term interface is often used to define an abstract type that contains no data, but exposes behaviors defined as methods. A class having all the methods corresponding to that interface is said to implement that interface (furthermore a class can implement multiple interfaces, and hence can be of different types at the same time). An interface is hence a type definition; anywhere an object can be exchanged (in a function or method call) the type of the object to be exchanged can be defined in terms of an interface instead of a specific class. This allows later code to use the same function exchanging different object types; hence such code turns out to be more generic and reusable.
21

Wikipedia

Interfaces

An interface is a kind of classifier that represents a declaration of a set of coherent public features and obligations. An interface specifies a contract; any instance of a classifier that realizes the interface must fulfill that contract. Since interfaces are declarations, they are not instantiable. Instead, an interface specification is implemented by an instance of an instantiable classifier, which means that the instantiable classifier presents a public facade that conforms to the interface specification. Note that a given classifier may implement more than one interface and that an interface may be implemented by a number of different classifiers.
UML Specification 2.0
22

Interfaces

Una interfaz (interface) es una coleccin de mtodos abstractos y constantes Una interfaz no puede ser instanciada Una clase que implementa una interfaz debe implementar los mtodos declarados en ella Una clase puede implementar mltiples interfaces Una interfaz define un tipo de datos que se puede utilizar en la declaracin de variables Una variable declarada mediante una interfaz puede referenciar un objeto de alguna clase que implemente la interfaz Java soporta herencia mltiple de interfaces
23

Definiendo una Interfaz


interface Printable { int PORTRAIT = 0; int LANDSCAPE = 1; void print(int orientacion); }

Campos son automticamente public final static Mtodos son automticamente public abstract
24

Implementando una Interfaz


class Libro extends Documento implements Printable { public void print(int orientacion) { // implementacin } }
class Empleado implements Printable { public void print(int orientacion) { ... } } class Rectangulo implements Printable { public void print(int orientacion) { ... } }
25

Usando una Interfaz

Capa genrica
class ColaImpresion { static void creaJob(Printable p) { p.print(Printable.PORTRAIT); } }

Capa cliente
ColaImpresion.creaJob(new Empleado()); ColaImpresion.creaJob(new Rectangulo()); Libro libro = new Libro(); ColaImpresion.creaJob(libro);
26

Resumen

Herencia es un concepto de OOP mediante el cual una clase adquiere las propiedades y los mtodos de otra Una variable de un tipo de datos ancestro puede ser utilizada para referenciar una instancia de una clase descendiente Al invocar sobre un objeto un mtodo de instancia que ha sido redefinido en subclases, la mquina virtual invoca el mtodo definido en la clase real del objeto, obtenida en tiempo de ejecucin
27

Resumen

Una clase abstracta (abstract) puede contener mtodos abstractos Una interfaz (interface) es una coleccin de mtodos abstractos y constantes Las clases abstractas y las interfaces no pueden ser instanciadas Una clase puede extender a una clase, e implementar un nmero ilimitado de interfaces Si una clase define o hereda mtodos abstractos, debe ser declarada abstracta
28

Potrebbero piacerti anche