Si lee el código fuente de Eclipse, encontrará que IAdaptable es una interfaz muy popular que es implementada por muchos otros. ¿Por qué tantas clases / interfaces implementan IAdaptable? La respuesta es que Adapter es el patrón de diseño principal para eclipse Core Runtime.
¿Qué es IAdaptable?
public interface IAdaptable {
/**
* Returns an object which is an instance of the given class
* associated with this object. Returns <code>null</code> if
* no such object can be found.
*
* @param adapter the adapter class to look up
* @return a object castable to the given class,
* or <code>null</code> if this object does not
* have an adapter for the given class
*/
public Object getAdapter(Class adapter);
}
|
public interface IAdaptable {/ ** * Devuelve un objeto que es una instancia de la clase dada * asociada con este objeto. Devuelve null
si * no se puede encontrar tal objeto. * * @param adaptor la clase de adaptador para buscar * @return un objeto convertible a la clase dada, * o null
si este objeto no * tiene un adaptador para la clase dada * / public Object getAdapter (Adaptador de clase); }
IAdaptable se utiliza para el soporte de la extensión Eclipse. Adapta una clase existente a otra interfaz. El método getAdapter devuelve un objeto convertible a la interfaz dada.
Vale la pena mencionar que adaptar una clase significa obtener una clase contenedora que es un subtipo del objetivo. La clase contenedora envuelve al adaptado.
¿Por qué necesitamos IAdaptable?
A medida que se agregan nuevas características al sistema, y esas nuevas características requieren servicios proporcionados por la clase existente, necesitamos hacer que los servicios existentes sean aplicables a las nuevas características (es decir, la clase).
Un ejemplo típico es la vista Propiedades de Eclipse. Presenta un conjunto de propiedades del objeto seleccionado. Cuando selecciona cualquier elemento en la vista Pacakge o en la vista Jerarquía, la vista de propiedades mostrará las propiedades del elemento seleccionado.
La vista de propiedades necesita una interfaz para obtener las propiedades y luego mostrarlas. La interfaz es IPropertySource.
El complemento org.eclipse.resources proporciona interfaces como IResource, IFile, IFolder, etc. Si queremos que la vista de propiedades muestre las propiedades de IFile, una forma es permitir que IFile extienda IPropertySource. Esto funcionará, pero hay varios problemas de esta solución.
public interface IFile extends IPropertySource
|
IFile de interfaz pública extiende IPropertySource
En primer lugar, se debe cambiar un objeto IFile para implementar métodos de IPropertySource. En segundo lugar, es posible que necesitemos IFile para implementar muchas otras interfaces, entonces el resultado sería inflado.
Si un objeto IFile implementa la interfaz IAdapter, entonces
public Object getAdapter(Class adapter){
if(adapter.equals(IPropertySource.class)){
return new PropertySourceAdapter(this);
}
return null;
}
|
public Object getAdapter (Adaptador de clase) {if (adapter.equals (IPropertySource.class)) {return new PropertySourceAdapter (esto); } devolver nulo; }
class PropertySourceAdapter implements IPropertySource{
private final Object item;
public PropertySourceAdapter(Object item){
this.item = item;
}
//required methods of IPropertySource ...
}
|
la clase PropertySourceAdapter implementa IPropertySource {elemento de objeto final privado; PropertySourceAdapter público (elemento de objeto) {this.item = elemento; } // métodos requeridos de IPropertySource …}
De esta manera, los objetos que implementan la interfaz IAdaptable se pueden adaptar fácilmente a cualquier interfaz dada.
En realidad, esta no es la solución utilizada en eclipse, porque esto requiere cambios de clase IFile. Cuando lea la parte 3 de IAdaptable, encontrará que IFile no debe cambiarse. El adaptador está configurado en el archivo plugin.xml.