Polimorfismo en objetos
El polimorfismo es una relajación
del sistema de tipos, de tal manera que una referencia a una clase (atributo,
parámetro o declaración local o elemento de un vector) acepta direcciones de
objetos de dicha clase y de sus clases derivadas (hijas, nietas, …).
Ahora párate a
pensar en clases y objetos. Quédate con esto: Tal como funcionan los
lenguajes fuertemente tipados, una variable siempre deberá apuntar a un objeto
de la clase que se indicó en el momento de su declaración. Una función cuyo
parámetro se haya declarado de una clase, sólo te aceptará recibir objetos de
esa clase. Un array que se ha declarado que es de elementos de una clase
determinada, solo aceptará que rellenemos sus casillas con objetos de esa clase
declarada.
Vehiculo[]
misVehiculos = new Vehiculo[3];
Esa variable
misVehiculos es un array y en ella he declarado que el contenido de las
casillas serán objetos de la clase "Vehiculo". Como se ha explicado,
en lenguajes fuertemente tipados sólo podría contener objetos de la clase
Vehiculo. Pues bien, polimorfismo es el mecanismo por el cual podemos "relajar
el sistema de tipos", de modo que nos acepte también objetos de las clases
hijas o derivadas.
Por tanto, la
"relajación" del sistema de tipos no es total, sino que tiene que ver
con las clasificaciones de herencia que tengas en tus sistemas de clases. Si
defines un array con casillas de una determinada clase, el compilador también
te aceptará que metas en esas casillas objetos de una clase hija de
la que fue declarada. Si declaras que una función recibe como parámetros
objetos de una determinada clase, el compilador también te aceptará que le
envíes en la invocación objetos de una clase derivada de aquella que fue
declarada.
En concreto,
en nuestro array de vehículos, gracias al polimorfismo podrás contener en los
elementos del array no solo vehículos genéricos, sino también todos los objetos
de clases hijas o derivadas de la clase "Vehiculo", osea objetos de
la clase "Coche", "Moto", "Bus" o cualquier hija
que se haya definido.
Herencia en Programación Orientada a Objetos
La herencia es
la transmisión del código entre unas clases y otras. Para soportar un mecanismo
de herencia tenemos dos clases: la clase padre y la/s clase/s hija/s. La clase
padre es la que transmite su código a las clases hijas. En muchos lenguajes de
programación se declara la herencia con la palabra "extends".
class Hija extends Padre{ }
Eso quiere
decir que todo el código de la clase padre se transmite, tal cual, a la clase
hija. Si lo quieres ver así, es como si tuvieras escrito, línea a línea, todo
el código de la class "Padre" dentro
de las llaves de la class "Hija". Por eso, la herencia es
fundamental para reutilizar código, porque no necesitas volver a incorporar el
código de Padre en Hija, sino que realmente al hacer el "extends" es
como si ya estuviera ahí.
Jerarquización
Es un proceso
por el cual se crean organizaciones de elementos en distintos niveles. No es un
concepto específicamente de POO, sino que es algo que vemos en la vida real en
muchos ámbitos, algo inherente a cualquier tipo de sistema. Puedo tener
diversos tipos de jerarquías, como clasificación o composición.
Composición: Es cuando unos
elementos podemos decir que están compuestos de otros, o que unos elementos
están presentes en otros. Por ejemplo, el sistema respiratorio y los pulmones,
la nariz, etc. Podemos decir que los pulmones están dentro del sistema
respiratorio, así como dentro de los pulmones encontramos bronquios y alvéolos.
En esta jerarquía de elementos tenemos composición porque donde unos forman
parte de otros. En una factura también podemos decir que puede haber una
jerarquía de composición. La factura tiene un cliente, varios conceptos
facturables, un impuesto, etc.
Clasificación: Este tipo de
jerarquización indica que unos elementos son una especialización de otros. Por
ejemplo, los animales, donde tenemos vertebrados e invertebrados. Luego, dentro
de los vertebrados encontramos aves, reptiles, mamíferos, etc. En los mamíferos
encontramos perros, vacas, conejos... Éste es el tipo de jerarquización en que
quiero que te fijes.
Los lenguajes
de programación orientados a objetos son capaces de crear jerarquizaciones
basadas en composición con lo que ya sabemos de clases y objetos. Eso es porque
podemos tener como propiedades de objetos, otros objetos. Por ejemplo, en el
caso de la factura, podríamos tener como propiedades el cliente, el impuesto,
la lista de conceptos facturables, etc. Sin embargo, para hacer jerarquías de
clasificación nos hace falta conocer la herencia.
Interfaces
Una interfaz es un conjunto de
métodos abstractos y de constantes cuya funcionalidad es la de determinar el
funcionamiento de una clase, es decir, funciona como un molde o como una
plantilla. Al ser sus métodos abstractos este no tiene funcionalidad alguna,
sólo se definen su tipo, argumento y tipo de retorno.
La construcción de una Interfaz es la siguiente:
public
Interfaz NombreInterfaz{
//Código
}
Para declarar una o más Interfaces ponemos, a la derecha del nombre de la clase, la palabra clave "implements" seguido de los nombres de las interfaces separadas por comas.:
class NombreClase implements
Interfaz1,Interfaz2,Interfaz3{
//Código
}
También es posible heredar e implementar al mismo
tiempo:
class NombreClase extends Herencia implements
Interfaz1,Interfaz2,Interfaz3{
//Código
}
Veamos algunas características de las Interfaces:
·
Las Interfaces solo pueden tener visibilidad de package o public.
·
Todos los métodos declarados en una Interfaz son public y abstract,
si no se le indica, Java lo pondrá implícitamente.
·
Los métodos de una Interfaz no pueden ser
estáticos, ya que estos deben ser redefinidos, y al ser estáticos les sería
imposible.
·
Todos los atributos declarados en una Interfaz
son "public static final" y deberán tener asignado un valor
constante. Todos los nombres de constantes van en "MAYÚSCULAS"
·
Una clase puede implementar una o más
interfaces.
·
Una Interfaz puede heredar de una o varias
interfaces, pero no pueden implementar NADA. Como sabemos, las clases solo
pueden heredar de otra clase, pero las Interfaces pueden hacer herencias múltiples.
·
Todas las clases que implementen una interfaz
deben de redefinir todos los métodos de esa interfaz.
·
Las interfaces no tienen constructor, por lo que
no es posible crear objetos con el operador "new" de ésta.
·
Si se implementa en una clase una Interfaz, y
esta Interfaz hereda de otra, la clase deberá implementar todos los métodos de
la interfaz que implementa y de los métodos que esta hereda.
·
Para la herencia de las interfaces se pone la
palabra clave extends y se ponen todas las interfaces que se deseen
separadas por comas.
·
Una Interfaz puede ocultar constantes y métodos
heredados de otras Interfaces si los vuelve a declarar en la clase que hereda.
Fuente:http://www.desarrolloweb.com/articulos/polimorfismo-programacion-orientada-objetos-conc
http://www.desarrolloweb.com/articulos/herencia-en-programacion-orientada-objetos.html
http://picarcodigo.blogspot.com/2012/10/interfaces.html
Fuente:http://www.desarrolloweb.com/articulos/polimorfismo-programacion-orientada-objetos-conc
http://www.desarrolloweb.com/articulos/herencia-en-programacion-orientada-objetos.html
http://picarcodigo.blogspot.com/2012/10/interfaces.html
No hay comentarios:
Publicar un comentario