Sei sulla pagina 1di 8

Universidad Los ngeles de Chimbote

Curso: Tcnicas de Programacin

HERENCIA Y POLIMORFISMO
HERENCIA
La herencia es una de las caractersticas fundamentales de la POO, ya que es la que permite un gran aumento en la reutilizacin de cdigo. La posibilidad de crear nuevas clases basadas en otras pre-existentes permite, entre otras cosas, crear bibliotecas genricas, en base a las cuales realizar pequeos ajustes para adaptarlas a las necesidades puntuales de cada aplicacin. Para crear una clase basada en una pre-existente se utiliza la siguiente sintaxis: class SubClase extends SuperClase { } Una subclase hereda todos los mtodos y propiedades que le provee su superclase y puede utilizarlos como propios. Una superclase puede ser a su vez subclase de otra y as se estructura una jerarqua de clases, donde hacia abajo aumenta la especializacin y hacia arriba la generalidad. Ejemplo:

En este caso, todos los animales tienen, por ejemplo, un mtodo comer, todos los mamferos un mtodo mamar y todas las aves un mtodo volar. Aqu el mecanismo de herencia permite desarrollar una sola vez los mtodos de son comunes a todas las subclases y slo programar en stas aquellas caractersticas que las diferencian de sus pares. Se considera que una instancia de una subclase es tambin instancia de toda superclase de la misma, en el ejemplo, todo perro es un mamfero y tambin un animal, lo cual implica que todo perro tiene todas las propiedades y mtodos propios de los mamferos, as como tambin aquellas de los animales. De este modo, una clase puede utilizar mtodos que no tiene definidos de la misma forma en que utilizara los propios: class SuperClase { protected int unMetodo() { return 1; } Docente: Ing. Pedro Beltrn Canessa ~1~

Universidad Los ngeles de Chimbote } class SubClase extends SuperClase { public void otroMetodo() { System.out.println( unMetodo() ); } }

Curso: Tcnicas de Programacin

A su vez, una subclase podra optar por reemplazar algn mtodo heredado de una superclase, para especificar un comportamiento diferente. Por ejemplo, todos los animales comen, pero para un perro no significa lo mismo comer que para un gato. En Java, todas las clases automticamente heredan de una clase llamada Object, la cual provee ciertos mtodos, entre ellos toString(), un mtodo que muestra la representacin en una cadena de caracteres del objeto en cuestin y que generalmente es una buena idea sobrescribir. Si una subclase oculta (sobrescribe) un mtodo de su superclase, an puede querer en algn caso utilizar el original. Para lograr este objetivo se usa la palabra clave super. Ejemplo: Programa que crea un objeto llamando persona, el cual lee e imprime el nombre y edad de una persona. 1 class Persona{ 2 3 4 5 6 7 8 9 10 11 } 1 //clase que se deriva de Persona 2 class Persona2 extends Persona{ 3 4 5 6 7 8 } ~2~ public double sueldo; public Persona2(String nom, int x, double sal) { super(nom, x); sueldo=sal; } public Persona(String nom, int x) { Nombre=nom; edad=x; public String Nombre; public int edad;

Docente: Ing. Pedro Beltrn Canessa

Universidad Los ngeles de Chimbote 1 //clase que implementa la Clase Persona2 2 class UsaPersona2{ 3 public static void main(String args []) { 4 5 6 7} Persona2 Jefe=new Persona2("Manuel", 20, 563.99);

Curso: Tcnicas de Programacin

System.out.println("Nombre: "+Jefe.Nombre+"\nEdad: "+Jefe.edad+"\nSueldo: "+Jefe.sueldo); }

La sentencia super lo que hace es llamar al constructor de la superclase (clase de la que heredamos). En la funcin principal es donde se crea el objeto que llama al miembro constructor, al cual hay que pasar 3 valores (uno para la clase punto2 y dos para la clase punto). En casos en que se vea involucrada la herencia, los constructores toman un significado especial porque lo normal es que la subclase necesite que se ejecute el constructor de la superclase antes que su propio constructor, para que se inicialicen correctamente aquellas variables que deriven de la superclase. En C++ y Java, la sintaxis para conseguir esto es sencilla y consiste en incluir en el cuerpo del constructor de la subclase como primera lnea de cdigo la siguiente sentencia: super( parametros_opcionales ); Esto har que se ejecute el constructor de la superclase, utilizando los parmetros que se pasen para la inicializacin. En el cdigo del ejemplo siguiente, ilustra el uso de esta palabra clase para llamar al constructor de la superclase desde una subclase. class SuperClase { int varInstancia; // Es necesario proporcionar el constructor por defecto,que // es aquel que no tiene parametros de llamada SuperClase(){} // Este es el constructor parametrizado de la superclase SuperClase( int pDato ) { System.out.println( "Dentro del constructor de la SuperClase" ); varInstancia = pDato; } void verVarInstancia() { System.out.println( "El Objeto contiene " + varInstancia ); } }

Docente: Ing. Pedro Beltrn Canessa

~3~

Universidad Los ngeles de Chimbote class SubClase extends SuperClase { // Este es el constructor parametrizado de la subclase SubClase( int bDato ) { // La siguiente sentencia println no compila, la llamada // a super() debe estar al principio de un metodo en caso de // que aparezca // System.out.println( "En el constructor de la SubClase" ); // Llamamos al constructor de la superclase super( bDato ); System.out.println( "Dentro del constructor de la SubClase" ); } } class javaherencia { public static void main( String args[] ) { System.out.println( "Lanzando la aplicacion" ); // Instanciamos un objeto de este tipo llamando al // constructor de defecto javaherencia obj = new javaherencia(); // Llamamos a la funcion pasandole un constructor de la // subclase parametrizado como parametro obj.miFuncion( new SubClase( 100 ) ); } // Esta funcion recibe un objeto y llama a uno de sus metodos // para presentar en pantalla el dato que contiene el objeto, // en este caso el metodo es heredado de la SuperClase void miFuncion( SubClase objeto ) { objeto.verVarInstancia(); } }

Curso: Tcnicas de Programacin

Si super no aparece como primera sentencia del cuerpo de un constructor, el compilador Java inserta una llamada implcita, super(), al constructor de la superclase inmediata. Es decir, el constructor por defecto de la superclase es invocado automticamente cuando se ejecuta el constructor para una nueva subclase, si no se especifica un constructor parametrizado para llamar al constructor de la superclase.

Docente: Ing. Pedro Beltrn Canessa

~4~

Universidad Los ngeles de Chimbote

Curso: Tcnicas de Programacin

La herencia es el mecanismo por el que se crean nuevos objetos definidos en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especializacin de Ave. class Pato extends Ave { int numero_de_patas; } La palabra clave extends se usa para generar una subclase (especializacin) de un objeto. Un Pato es una subclase de Ave. Cualquier cosa que contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato se pueden definir sus propios mtodos y variables de instancia. Se dice que Pato deriva o hereda de Ave. Adems, se pueden sustituir los mtodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, aqu hay un ejemplo de una clase derivada sustituyendo a la funcin Suma_a_i(): import MiClase; public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ); } } Ahora cuando se crea una instancia de MiNuevaClase, el valor de i tambin se inicializa a 10, pero la llamada al mtodo Suma_a_i() produce un resultado diferente: MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 ); Java se dise con la idea de que fuera un lenguaje sencillo y, por tanto, se le deneg la capacidad de la herencia mltiple, tal como es conocida por los programadores C++. En este lenguaje se aade cierta complejidad sintctica cuando se realiza herencia mltiple de varias clases, las cuales comparten una clase base comn ( hay que declarar dicha clase como virtual y tener bastante cuidado con los constructores), o tambin cuando las clases base tienen miembros de nombre similar (entonces hay que utilizar especificadores de acceso). Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sera como obtener el objeto toro mecnico a partir de una mquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los mtodos, es decir, pasar la funcionalidad del toro de verdad al toro mecnico, con lo cual no sera necesaria la herencia mltiple sino simplemente la comparticin de funcionalidad que se encuentra implementada en Java a travs de interfaces

Docente: Ing. Pedro Beltrn Canessa

~5~

Universidad Los ngeles de Chimbote

Curso: Tcnicas de Programacin

POLIMORFISMO
El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos, las mismas races de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple, morfismo= Formas , esto implica que un mismo Objeto puede tomar diversas formas. El polimorfismo es una habilidad de tener varias formas; por ejemplo, la clase Jefe tiene acceso a los Mtodos de la clase Empleado. Un objeto tiene slo un forma. diferentes maneras. En Java hay una clase que es la clase padre de todas las dems: java.lang.Object. Un mtodo de esta clase (por ejemplo: toString() que convierte cualquier elemento de Java a cadena utilizada por todos. A travs del concepto de Herencias ("Inheritance") es posible ilustrar este comportamiento: de caracteres), puede ser Una variable tiene muchas formas, puede apuntar a un objeto de

El poder manipular un Objeto como si ste fuera de un tipo genrico otorga mayor flexibilidad al momento de programar con Objetos, el trmino Polimorfismo tambin es asociado con un concepto llamado LateBinding (Ligamiento Tardo), observe el siguiente fragmento de cdigo: Figura a = new Circulo(); Figura b = new Triangulo(); Inicialmente se puede pensar que este cdigo generara un error debido a que el tipo de referencia es distinta a la instancia del objeto, sin embargo, el fragmento anterior es correcto y demuestra el concepto de Polimorfismo; para asentar este tema se describe un ejemplo ms completo:

Docente: Ing. Pedro Beltrn Canessa

~6~

Universidad Los ngeles de Chimbote import java.util.*; class Instrumento { public void tocar() { System.out.println("Instrumento.tocar()"); } public String tipo() { return "Instrumento"; } public void afinar() {} } class Guitarra extends Instrumento { public void tocar() { System.out.println("Guitarra.tocar()"); } public String tipo() { return "Guitarra"; } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.out.println("Piano.tocar()"); } public String tipo() { return "Piano"; } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System.out.println("Saxofon.tocar()"); } public String tipo() { return "Saxofon"; } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System.out.println("Guzla.tocar()"); } Docente: Ing. Pedro Beltrn Canessa

Curso: Tcnicas de Programacin

~7~

Universidad Los ngeles de Chimbote public void afinar() { System.out.println("Guzla.afinar()"); } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.out.println("Ukelele.tocar()"); } public String tipo() { return "Ukelele"; } } public class Musica { // No importa el tipo de Instrumento, // seguir funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // ... i.tocar(); } static void afinarTodo(Instrumento[] e) { for(int i = 0; i < e.length; i++) afinar(e[i]); } public static void main(String[] args) { Instrumento[] orquesta = new Instrumento[5]; int i = 0; // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(); orquesta[i++] = new Piano(); orquesta[i++] = new Saxofon(); orquesta[i++] = new Guzla(); orquesta[i++] = new Ukelele(); afinarTodo(orquesta); } }

Curso: Tcnicas de Programacin

Docente: Ing. Pedro Beltrn Canessa

~8~

Potrebbero piacerti anche