Frage

Lassen Sie uns sagen, ich habe eine abstrakte Superklasse namens „Form“, und dass es mehrere Unterklassen (Dreieck, Quadrat, Kreis ...). Ich möchte eine abstrakte Methode in der übergeordneten „Form“ Klasse definieren, die alle Unterklassen implementieren müssen, nennen wir es „zeichnen“. So können alle Formunterklassen müssen die „draw ()“ Methode zur Verfügung stellen. Aber nimmt das Streck-Verfahren einen Parameter des Typs „Schablone“, und nicht jede Form Unterklasse kann nur jede Schablone verwenden ...

So gibt eine abstrakte „Form“ Klasse ist, mehrere Formunterklassen und mehrere Schablonen. Ich brauche ein Draw-Verfahren in der Form Klasse definiert. Ein Quadrat verwenden könnte Stencil1 und der Kreis könnte Stencil2 verwenden.

Ich vermute, dass Generika den Trick tun würde, aber ich bin nicht sicher. Jede Form Unterklasse muss das Streck-Verfahren mit einer bestimmten Schablone definieren, da diese Klassen von anderen Klassen als auch verwendet werden, und die Compiler sollten alle Programmierer zwingen, die Ziehverfahren mit der Schablone zu nennen, die von dieser Klasse unterstützt wird. Wir können nicht eine abstrakte Methode wie „public void draw (Stencil s)“ definieren, da dann der Programmierer in jeder Schablone zum Quadrat Klasse passieren könnte, während die quadratische Klasse unterstützt nur „Stencil1“

Irgendwelche Ideen?

Update1: Sollte hinzufügen, dass die Form-Klasse kümmert sich nicht darum, die Schablone von der Unterklasse verwendet wird, aber da die Unterklassen in anderen Klassen auch verwendet werden, ist es wichtig, dass das Draw-Verfahren definiert wird, so dass nur die unterstützte Schablone vom Compiler akzeptiert wird.

War es hilfreich?

Lösung

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

Andere Tipps

Ich glaube, Sie sollten wahrscheinlich Ihr erstes Design überdenken.

Natürlich können Sie könnte dies umgehen, indem instanceof verwenden, usw. Dies ist jedoch in einem sehr verwirrend API führen wird (wenn das, was Sie es verwenden für).

Wenn Sie wollen, dass diese bei der Kompilierung gefangen werden, werden die folgenden Optionen in den Sinn kommen:

  • Erstellen Sie eine Reihe von abstrakten Schablonen. Vor allem, wenn Sie denken, Sie können gruppieren. Wenn Sie also mehrere „square“ Schablonen haben werden, erstellen Sie eine SquareStencil abstrakte Art und leiten die konkreten Instanzen aus, dass. Sie können sie sogar als Untergruppe der abstrakten Stencils Klasse erstellen.
  • Überlastung der Streck-Verfahren. Es gibt keine Notwendigkeit für sie generisch zu sein. Lassen Sie den Compiler helfen Ihnen durch die richtige Methode für den Job wählen.

definiert eine abstrakte Schablone und lassen Sie die Unterklasse Konstruktor entscheiden, welche Schablonenklasse zu verwenden.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top