Domanda

Diciamo che ho una classe genitore astratta chiamata " forma " ;, e che ci sono più sottoclassi (triangolo, quadrato, cerchio ...). Voglio definire un metodo astratto nella forma principale "forma" classe che tutte le sottoclassi devono implementare, chiamiamola " draw " ;. Quindi tutte le sottoclassi di forma devono fornire il "quot (draw ()" metodo. Tuttavia, il metodo di disegno accetta un parametro di tipo "Stencil", e non tutte le sottoclassi di forme possono usare qualsiasi stencil ...

Quindi esiste una "forma" astratta. classe, sottoclassi a forme multiple e stencil multipli. Ho bisogno di un metodo di disegno definito nella classe di forma. Un quadrato potrebbe usare Stencil1 e il cerchio potrebbe usare Stencil2.

Suppongo che i generici farebbero il trucco, ma non ne sono sicuro. Ciascuna sottoclasse di forme deve definire il metodo di disegno con uno stencil specifico poiché queste classi sono utilizzate anche da altre classi e il compilatore dovrebbe forzare tutti i programmatori a chiamare i metodi di disegno con lo stencil supportato da quella classe. Non siamo in grado di definire un metodo astratto come " disegno astratto vuoto pubblico (Stencil) " perché quindi il programmatore potrebbe passare qualsiasi stencil alla classe quadrata, mentre la classe quadrata supporta solo "Stencil1"

Qualche idea?

Update1: Dovrebbe aggiungere che alla classe di forma non importa quale stencil viene utilizzato dalla sottoclasse, ma poiché anche le sottoclassi sono utilizzate in altre classi, è importante che il metodo di disegno sia definito in modo tale che solo lo stencil supportato sia accettato dal compilatore.

È stato utile?

Soluzione

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();
   }
}

Altri suggerimenti

Penso che dovresti probabilmente riconsiderare il tuo progetto iniziale.

Ovviamente, potresti aggirare questo problema usando instanceof, ecc. Tuttavia, questo si tradurrà in un'API molto confusa (se è per questo che lo stai usando).

Se vuoi che questo venga colto al momento della compilazione, ti vengono in mente le seguenti opzioni:

  • Crea un set di stampini astratti. Soprattutto se pensi di poterli raggruppare. Quindi, se avrai più " quadrati " stencil, crea un tipo astratto SquareStencil e ne ricava le istanze concrete. Puoi persino crearli come sottoinsieme della classe Stencil astratta.
  • Sovraccaricare il metodo di disegno. Non è necessario che sia generico. Lascia che il compilatore ti aiuti scegliendo il metodo giusto per il lavoro.

Definisci uno Stencil astratto e lascia che il costruttore della sottoclasse decida quale classe di stencil usare.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top