viernes, 20 de mayo de 2011

Exposicion Interface y Herencias

INTERFACES Y HERENCIA
INTERFACES

Hay una serie de situaciones en ingeniería de software cuando es importante para los grupos dispares de los programadores a aceptar un "contrato" que explica en detalle cómo interactúa su software. Cada grupo debe ser capaz de escribir su código sin ningún conocimiento de cómo el código del otro grupo que está escrito. En términos generales, las interfaces son dichos contratos.
Por ejemplo, imaginemos una sociedad futurista donde los pasajeros controlados por el ordenador robótico de transporte de coches por las calles de la ciudad sin un operador humano. Los fabricantes de automóviles escribir software (Java, por supuesto) que opera el automóvil parar, arrancar, acelerar, girar a la izquierda, y así sucesivamente. Otro grupo de industriales, fabricantes de instrumentos electrónicos de orientación, hacer que los sistemas informáticos que reciben GPS (Global Positioning System), los datos de posición y la transmisión inalámbrica de las condiciones del tráfico y utilizar esa información para conducir el coche.

Los fabricantes de automóviles deben publicar una interfaz estándar de la industria que se expone en detalle qué métodos pueden ser invocados para hacer el movimiento del coche (un coche, de cualquier fabricante). Los fabricantes de orientación a continuación, puede escribir software que invoca a los métodos descritos en la interfaz de comando del auto. Ninguno de los grupos industriales necesita saber cómo el software del otro grupo se lleva a cabo. De hecho, cada grupo considera que su software altamente propiedad y se reserva el derecho a modificar en cualquier momento, siempre y cuando sigue a adherirse a la interfaz de publicación.


INTERFACES EN JAVA

En el lenguaje de programación Java, una interfaz es un tipo de referencia, de forma similar a una clase, que sólo puede contener constantes, firmas de métodos y tipos anidados. No hay cuerpos de método. Las interfaces no se pueden crear instancias-que sólo pueden ser implementadas por clases o ampliado por otras interfaces. Extensión se discute más adelante en esta lección.
public interface OperateCar {

   // constant declarations, if any

   // method signatures
   int turn(Direction direction,   // An enum with values RIGHT, LEFT
              double radius, double startSpeed, double endSpeed);
   int changeLanes(Direction direction, double startSpeed, double endSpeed);
   int signalTurn(Direction direction, boolean signalOn);
   int getRadarFront(double distanceToCar, double speedOfCar);
   int getRadarRear(double distanceToCar, double speedOfCar);
         ......
   // more method signatures
}
En el ejemplo del coche robótico lo anterior, es que los fabricantes de automóviles que se implementa la interfaz. Aplicación de Chevrolet será sustancialmente diferente de la de Toyota, por supuesto, pero los fabricantes se adhieren a la misma interfaz. Los fabricantes de orientación, que son los clientes de la interfaz, a construir los sistemas que utilizan los datos del GPS en la ubicación de un automóvil, los mapas digitales de la calle, y los datos de tráfico para conducir el coche. De este modo, los sistemas de orientación se invocan los métodos de interfaz: girar, cambiar de carril, frenar, acelerar, y así sucesivamente.

INTERFACES API

El ejemplo del coche robótico muestra una interfaz que se utiliza como estándar de la industria Application Programming Interface (API). API también son comunes en los productos de software comercial. Normalmente, una compañía vende un paquete de software que contiene métodos complejos que otra empresa quiere usar en su propio producto de software. Un ejemplo sería un conjunto de métodos de procesamiento de imágenes digitales que se venden a empresas que los gráficos de usuario final de programas. La compañía de procesamiento de imágenes escribe sus clases para implementar una interfaz, que se hace público a sus clientes. La empresa gráfica a continuación, llama a los métodos de procesamiento de imágenes con las firmas y los tipos de cambio definido en la interfaz. Mientras que la API de la compañía de procesamiento de imágenes es hecho público (para sus clientes), la implementación de la API se mantiene como un secreto celosamente guardado, de hecho, es posible revisar la aplicación en una fecha posterior, siempre y cuando sigue aplicando la interfaz original que sus clientes han confiado en.

INTERFACES Y HERENCIA MÚLTIPLE

Las interfaces tienen otro papel muy importante en el lenguaje de programación Java. Las interfaces no forman parte de la jerarquía de clases, aunque funcionan en combinación con las clases. El lenguaje de programación Java no permite herencia múltiple (herencia se discute más adelante en esta lección), pero interfaces proporcionan una alternativa.
En Java, una clase puede heredar de una sola clase pero puede implementar más de una interfaz. Por lo tanto, los objetos pueden tener múltiples tipos: el tipo de su propia clase y los tipos de todas las interfaces que implementan. Esto significa que si una variable se declara el tipo de una interfaz, su valor puede hacer referencia a cualquier objeto que se crea una instancia de cualquier clase que implementa la interfaz. Esto se discute más adelante en esta lección, en la sección titulada "Uso de una interfaz como un tipo".

EL CONSEJO DE LA INTERFAZ
El cuerpo interfaz contiene declaraciones de métodos para todos los métodos incluidos en la interfaz. Una declaración de método dentro de una interfaz es seguida por un punto y coma, pero sin llaves, ya que la interfaz no proporciona implementaciones para los métodos declarados dentro de ella. Todos los métodos declarados en una interfaz son implícitamente públicos, por lo que el modificador público puede ser omitido.
Una interfaz puede contener declaraciones de constantes, además de declaraciones de métodos. Todos los valores constantes definidos en una interfaz son implícitamente públicos, estáticos y finales. Una vez más, estos modificadores se pueden omitir.
IMPLEMENTAR UNA INTERFAZ
Para declarar una clase que implementa una interfaz, se incluye una cláusula implements en la declaración de clase. Su clase puede implementar más de una interfaz, por lo que la palabra clave implements es seguido por una lista separada por comas de los interfaces implementados por la clase.
RESUMEN DE LAS INTERFACES

Una interfaz define un protocolo de comunicación entre dos objetos.
Una declaración de interfaz contiene las firmas, pero las implementaciones que no, para un conjunto de métodos, y también puede contener definiciones de constantes.
Una clase que implementa una interfaz debe implementar todos los métodos declarados en la interfaz.
El nombre de la interfaz se puede utilizar en cualquier tipo puede ser utilizado.

HERENCIA

En las lecciones anteriores, usted ha visto la herencia mencionado varias veces. En el lenguaje Java, las clases se pueden derivar de otras clases, de tal modo que hereda campos y métodos de las clases.

Definiciones:
Una clase que se deriva de otra clase que se llama una subclase (también una clase derivada, clase extendida, o un tipo de niño). La clase de la que la subclase es derivada se denomina superclase (también una clase base o una clase padre).
Con excepción de objetos, que no tiene superclase, cada clase tiene una y sólo una superclase directa (herencia simple). En ausencia de cualquier superclase explícita otros, cada clase es implícitamente una subclase de Object.

Las clases se pueden derivar de las clases que se derivan de las clases que se derivan de las clases, y así sucesivamente, y en última instancia deriva de la clase más alta, de objetos. Esta clase se dice que es descendiente de todas las clases de la cadena de herencia que se remonta a objetos.
La idea de la herencia es simple pero poderosa: Si desea crear una nueva clase y ya existe una clase que incluye parte del código que desee, puede derivar la nueva clase de la clase existente. Al hacer esto, puede volver a los campos y métodos de la clase existente sin tener que escribir (y depurar!) Por sí mismo.
Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros, por lo que no son heredados por las subclases, pero el constructor de la superclase puede ser invocado desde la subclase.
La plataforma Java jerarquía de clases
La clase de objetos, definidos en el paquete java.lang, define e implementa un comportamiento común a todas las clases, incluyendo los que se escribe. En la plataforma Java, muchas clases se derivan directamente de los objetos, otras derivan de algunas de esas clases, y así sucesivamente, formando una jerarquía de clases.
Lo que puede hacer en una subclase

Una subclase hereda todos los miembros públicos y protegidos de su padre, sin importar qué paquete que se encuentra el subclase Si la subclase está en el mismo paquete que su padre, también hereda los miembros privados del paquete de los padres. Usted puede utilizar los miembros heredados como es, reemplazarlos, ocultarlas, o complementarlos con los nuevos miembros:
Los campos heredados se pueden utilizar directamente, al igual que cualquier otro campo.
Se puede declarar un campo de la subclase con el mismo nombre que el de la superclase, con lo que se esconde (no recomendado).
Puede declarar nuevos campos en la subclase que no están en la superclase.
Los métodos heredados se pueden utilizar directamente como son.
Usted puede escribir un método nueva instancia de la subclase que tiene la misma firma que el de la superclase, reemplazando así la misma.
Usted puede escribir un nuevo método estático en la subclase que tiene la misma firma que el de la superclase, con lo que ocultarlo.
Puede declarar nuevos métodos en la subclase que no están en la superclase.
Puede escribir un constructor de la subclase que invoca el constructor de la superclase, ya sea implícita o utilizando la palabra clave super.
En las secciones siguientes de esta lección se ampliará sobre estos temas.

Los miembros privados de una Superclase

Una subclase no hereda los miembros privados de su clase padre. Sin embargo, si la superclase tiene métodos públicos o protegidos para acceder a sus campos privados, estos también pueden ser utilizados por la subclase.
Una clase anidada tiene acceso a todos los miembros privados de su clase, adjuntando los dos campos y métodos. Por lo tanto, una clase anidada público o protegido heredada por una subclase tiene acceso indirecto a todos los miembros privados de la superclase.



Los objetos de fundición

Hemos visto que un objeto es del tipo de datos de la clase de la que se crea una instancia.
Por ejemplo, si escribimos
myBike pública BTT BTT = new ();

a continuación, myBike es de tipo BTT.
BTT es descendiente de bicicletas y objetos. Por lo tanto, una BTT es una de bicicletas y también es un objeto, y puede ser utilizada dondequiera que los objetos de bicicletas u objeto se requieren.
Lo contrario no es necesariamente cierto: una bicicleta puede ser una BTT, pero no lo es necesariamente. Del mismo modo, un objeto puede ser una bicicleta o BTT uno, pero no lo es necesariamente.

Anulación y ocultación de los métodos

Instancia Métodos

Método de instancia en una subclase con la misma firma (nombre, además de la cantidad y el tipo de sus parámetros) y el tipo de cambio como un método de instancia en la superclase invalida el método de la superclase.
La capacidad de una subclase para reemplazar un método permite a una clase heredar de una superclase cuya conducta es "lo suficientemente cerca" y luego a modificar el comportamiento según sea necesario. El método primordial tiene el mismo nombre, número y tipo de parámetros y el tipo de cambio como el método que reemplaza. Un método primordial también puede devolver un subtipo del tipo devuelto por el método reemplazado. Esto se llama un tipo de retorno covariantes.
Al reemplazar un método, es posible que desee utilizar la anotación @ Override que indica al compilador que tiene la intención de reemplazar un método en la superclase. Si, por alguna razón, el compilador detecta que el método no existe en una de las superclases, generará un error. Para obtener más información sobre @ Override, ver las anotaciones.

La clase Methods

Si una subclase define un método de clase con la misma firma que un método de clase en la superclase, el método en la subclase esconde el de la superclase.
La distinción entre ocultar y fundamentales tiene implicaciones importantes. La versión del método reemplazado que se invoca es el de la subclase. La versión del método oculto que se invoca depende de si se invoca desde la superclase o subclase. Veamos un ejemplo que contiene dos clases.