Pregunta

Digamos que tengo una clase padre abstracta llamada "forma" y que hay varias subclases (triángulo, cuadrado, círculo ...). Quiero definir un método abstracto en la forma " madre " " clase que todas las subclases deben implementar, llamémosla " draw " ;. Por lo tanto, todas las subclases de formas deben proporcionar el " draw () " método. Pero, el método de dibujo toma un parámetro de tipo "Plantilla", y no todas las subclases de formas pueden usar cualquier plantilla ...

Así que hay una forma " " resumen " clase, subclases de formas múltiples, y múltiples plantillas. Necesito un método de dibujo definido en la clase de forma. Un cuadrado podría usar Stencil1 y el círculo podría usar Stencil2.

Supongo que los genéricos harían el truco, pero no estoy seguro. Cada subclase de forma necesita definir el método de dibujo con una plantilla específica porque estas clases también son utilizadas por otras clases, y el compilador debe obligar a todos los programadores a llamar a los métodos de dibujo con la plantilla que es compatible con esa clase. No podemos definir un método abstracto como " public abstract void draw (Stencil s) " porque entonces el programador podría pasar cualquier plantilla a la clase cuadrada, mientras que la clase cuadrada solo admite " Stencil1 "

¿Alguna idea?

Update1: Debe agregar que a la clase de forma no le importa qué plantilla se usa en la subclase, pero como las subclases también se usan en otras clases, es importante que el método de dibujo esté definido para que el compilador solo acepte la plantilla compatible.

¿Fue útil?

Solución

public abstract class Shape<S extends Stencil>
{
   public abstract void draw( S stencil );
}

public class Square extends Shape<Stencil1>
{
   public void draw( Stencil1 stencil )
   {
     stencil.letsdo();
     stencil.some();
     stencil.drawing();
   }
}

public class Circle extends Shape<Stencil2>
{
   public void draw( Stencil2 stencil )
   {
      stencil.some();
      stencil.more();
      stencil.drawing();
   }
}

Otros consejos

Creo que probablemente deberías reconsiderar tu diseño inicial.

Por supuesto, usted podría solucionar este problema mediante el uso de instanceof, etc. Sin embargo, esto resultará en una API muy confusa (si es para eso que la está usando).

Si desea que esto se detecte en tiempo de compilación, las siguientes opciones vienen a la mente:

  • Crea un conjunto de plantillas abstractas. Particularmente si crees que puedes agruparlos. Así que si tienes múltiples " cuadrado " plantillas, cree un tipo abstracto de SquareStencil y derive las instancias concretas de eso. Incluso puede crearlos como un subconjunto de la clase de Plantillas abstractas.
  • Sobrecarga el método de sorteo. No hay necesidad de que sea genérico. Deje que el compilador le ayude eligiendo el método correcto para el trabajo.

Defina un Stencil abstracto y deje que el constructor de la subclase decida qué clase de stencil usar.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top