2012-04-04 12 views
12

tengo clase como:¿Cómo envolver la clase en Java y guardar la interfaz?

MyClass extends MyAbstractClass implement myInterface1, myInterface2,... 

Necesito crear una nueva clase con campos adicionales:

MyType1 field1; 
MyType2 field2; 
....... 

Parece que correcta crear nueva clase, que envolverá MiClase como:

MyWrapClass { 
MyClass myClass=new MyClass(...); 
MyType1 field1; 
MyType2 field2; 
..... 

Pero MyWrapClass utilizado como tipo myInterface1 o myInterface2!

Así que la pregunta es: ¿debo declarar todos los métodos que se necesitan para las interfaces myInterface1, myInterface2 en MyWrapClass? O existe otra forma? Gracias.

+0

Si necesita crear una clase con un campo nuevo, debe extender la clase original. Alguien me dijo que es mejor hacer una variable de una Interfaz en lugar de una clase y eso se debe a que se pueden agregar métodos a una interfaz sin cambiar el código de la clase completa y cada clase que usa una instancia de esa clase. . Esto todavía me ha permitido obtener una buena respuesta, pero podría ser útil para extender las clases y agregar nuevos métodos que usted desea hacer. –

Respuesta

16

Básicamente, hay dos maneras. El primero es extender la clase base:

public class MySubClass extends MyClass { 
    private MyType1 field1; 
    private MyType2 field2; 
.... 

La segunda opción es el uso de la composición:

public class MySubClass implements myInterface1, myInterface2 { 
     private MyClass delegate; 
     private MyType1 field1; 
     private MyType2 field2; 

     // for all methods in myInterface1, myInterface2 
     public SomeType method1() { 
     return delegate.method1(); 
     } 
     ... 
} 

La segunda opción es recomendado por muchos de Java Gurús:

libro Effective Java de Josh Bloch Segunda edición

  • Artículo 16: Favor composición sobre la herencia
  • Tema 17: Diseño y documento para la herencia o de lo contrario lo prohíben

buen diseño orientado a objetos no se extiende alrededor liberalmente clases existentes. Su primer instinto debe ser componer en su lugar.

Ver también http://en.wikipedia.org/wiki/Composition_over_inheritance

composición sobre la herencia puede simplificar el diseño inicial de las clases de dominio de negocios y proporcionar un dominio de negocio más estable en el largo plazo. Su ventaja sobre la herencia es un aislamiento de intereses más completo del que puede describir una jerarquía de clases descendientes. Además, los modelos de herencia a menudo se idean durante la definición de las clases de dominio empresarial para dar sentido a la información en el dominio del problema y no necesariamente reflejan la verdadera relación de varios objetos del sistema.

P.S .: código de generación automática para la composición es apoyada por algunos de los IDE modernos

3

No envuelva, simplemente subclase:

class MySubClass extends MyClass { 
    MyType1 field1; 
    MyType2 field2; 
    ... 
2

Suponiendo que no se puede extender MiClase, entonces no hay ninguna otra manera puede tener MyWrapClass y utilizarlo como MiClase. Por ejemplo, me ha sucedido que tengo que implementar Map para envolver un mapa real. Tiene muchas funciones y cada una de ellas debe implementarse para poder usar. Hay un pequeño margen aquí, en el sentido de que si no planeas pasarlo a una función que no escribiste, puedes agregar todos los métodos necesarios e implementar solo los que necesites. Aunque la mayoría de las veces ese no es el caso.

Alternativamente, podría escribir una clase ficticia que implemente todos los métodos de las interfaces que llaman al wrapper. Luego, puede anular esta clase con su propia implementación, lo que le permite reciclar una clase contenedora sin tener que implementar todos los métodos cada vez.

2

Supongamos que no se puede extender MyClass y que desea poder utilizar MyWrapClass tipo myInterface1 o myInterface2. Puede hacer lo siguiente:

MyWrapClass implement myInterface1, myInterface2,...{ 
    MyClass myClass=new MyClass(...); 
    MyType1 field1; 
    MyType2 field2; 

    methodInInterface1() { 
     myClass.methodInInterface1() 
    } 

    .... 

delegar toda la aplicación en métodos myInterface1 y myInterface2 a MiClase. Creo que esto se llama Composición.

+0

@Eugen Retunsky me ganaste. aclamaciones, – hongbo

Cuestiones relacionadas