Cómo lanzar una propiedad encapsulada heredada para exponer métodos de subclase - Java

En Java tengo una clase base abstracta, digamos WrapX, que contiene una propiedad de un tipo, digamos X(piense en Decorator DP). Esta clase presenta un método para llamar a un método específico en el encapsulado X:

public abstract class WrapX{

  protected X instance;

  public WrapX(X x){
     this.instance = x;
  }

  public void foo(){
       instance.foo();
  }

}

public class X {

   public void foo(){
       System.out.println("foo");
   }
}

Luego hay una clase llamada Yque se extiende desde Xy proporciona un método adicional:

public class Y extends X {

  public void bar(){
     System.out.println("bar");
  }
}

Entonces, naturalmente, he creado WrapYque se puede usar como tipo decorado sobre el tipo Y:

public class WrapY extends WrapX{

  ...

  public void bar(){
    instance.bar();
  }

}

Así que aquí yace el problema. WrapYha heredado la instancepropiedad de tipo Xde su padre WrapX. En lo que respecta a Eclipse, instancees de tipo Xy se quejará de que no contiene ningún método .bar().

Bastante justo, por supuesto, pero ¿cómo entonces en esta subclase podemos convertir implícitamente instancea un instancede Y(una subclase válida del tipo inicial X) ... SIN la necesidad de atribuciones de conversión explícitas que ensucian el código o el sombreado variable?

Si acabo de tener esto en el constructor:

public WrapY(Y y){
 this.instance = y;
}

Eclipse todavía se queja de que .bar()no es un método de tipo Xporque supongo que no puede inferir con certeza qué WrapY(Y y)se usará antes de construir la WrapYinstancia:

public void bar(){
        instance.bar(); // ERROR
      }

Aquí está el enfoque actual que tengo, lleno de moldes:

public WrapY(Y y){
 (Y)instance = y;
}

public void bar(){
  ((Y)instance).bar();
}

No he encontrado este tipo particular de problema arquitectónico en mi experiencia antes, archívelo bajo 'Decorador basado en herencia-tipo-Casting' (!) ... Por favor, explíqueme cómo puedo modelar esto de una mejor manera camino.

Otro problema es que, si en el futuro alguien se extiende WrapY, el tipo de instancia que hereda su clase será el tipo natural (no emitido) X, cuando puedan asumir razonablemente que debería ser de tipo Y.

Gracias

Respuesta 1

Escribo una aplicación de Android y uso GeoFirestore. No puedo obtener una lista con los usuarios de Firestore dentro de un rango de 30 metros. Creo que me equivoqué al hacer una estructura de datos. Estructura de datos: ¿...

Tengo que pensar mucho sobre la optimización en una aplicación de Android por primera vez. He buscado, pero cuanto más busco, más me confundo. ¿Alguien sabe de buena documentación para describir ...

Estoy tratando de codificar una Cadena usando el cifrado XOR y uso una matriz de bytes como clave: Cadena encodedString = myString XOR myKey No tengo mucha experiencia con la criptografía, así que no he encontrado una manera ...

He escrito este código para la importación de servlets java.io. *; import javax.servlet. *; import javax.servlet.http. *; public class Httpservlet1 extiende HttpServlet {public void doGet (...