Pergunta

Digamos que eu tenho uma classe pai abstrata chamada "forma", e que existem várias subclasses (triângulo, quadrado, círculo ...). Eu quero definir um método abstrato no pai classe "forma" que todas as subclasses devem implementar, vamos chamá-lo de "desenhar". Assim, todas as subclasses forma deve fornecer o método de "draw ()". Mas, o método de sorteio tem um parâmetro do tipo "estêncil", e, nem toda forma subclasse pode usar apenas qualquer stencil ...

Assim, há uma classe abstrata "forma", várias subclasses de forma, e vários stencils. Preciso um método de desenho definido na classe forma. Um quadrado pode usar Stencil1 eo círculo pode usar Stencil2.

Eu estou supondo que os genéricos iria fazer o truque, mas eu não tenho certeza. As necessidades de cada subclasse de forma a definir o método de desenho com um stencil específico porque estas classes são usadas por outras classes, bem como, e o compilador deve forçar todos os programadores para chamar os métodos desenhar com o stencil que é suportado pela referida classe. Não podemos definir um método abstrato como "public abstract vazio empate (estêncil s)" porque então o programador poderia passar em qualquer estêncil para a classe quadrado, enquanto a classe quadrado suporta apenas "Stencil1"

Todas as idéias?

Update1: De acrescentar que a classe forma não se importa que stencil é usado pela subclasse, mas desde que as subclasses são usados ??em outras classes também, é importante que o método de sorteio é definido de modo que apenas o estêncil suportado é aceito pelo compilador.

Foi útil?

Solução

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

Outras dicas

Eu acho que você provavelmente deveria reconsiderar seu projeto inicial.

Claro, você poderia contornar isso usando instanceof, etc. No entanto, isso irá resultar em uma API muito confuso (se é isso que você está usando para isso).

Se você quer este ser pego em tempo de compilação, as seguintes opções vêm à mente:

  • Criar um conjunto de stencils abstratos. Especialmente se você acha que você pode agrupá-los. Então, se você vai ter vários stencils "quadrado", criar um tipo abstrato SquareStencil e derivar os casos concretos de que. Você mesmo pode criá-los como um subconjunto da classe Stencils abstrato.
  • Overload o método draw. Não há necessidade para que seja genérico. Deixe o compilador de ajuda que você escolhendo o método certo para o trabalho.

Defina um estêncil abstrato e deixe o construtor de subclasse decidir qual classe estêncil para uso.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top