2

「shape」という抽象的な親クラスがあり、複数のサブクラス(三角形、正方形、円...)があるとします。すべてのサブクラスが実装する必要のある親の「shape」クラスに抽象メソッドを定義したいので、それを「draw」と呼びましょう。したがって、すべての形状サブクラスは「draw()」メソッドを提供する必要があります。ただし、drawメソッドは「Stencil」タイプのパラメーターを取り、すべての形状サブクラスが任意のステンシルだけを使用できるわけではありません。

したがって、1つの抽象的な「形状」クラス、複数の形状サブクラス、および複数のステンシルがあります。shapeクラスで定義されたdrawメソッドが必要です。正方形はStencil1を使用し、円はStencil2を使用する場合があります。

ジェネリックスでうまくいくと思いますが、よくわかりません。これらのクラスは他のクラスでも使用されるため、各形状サブクラスは特定のステンシルを使用して描画メソッドを定義する必要があります。コンパイラは、すべてのプログラマに、そのクラスでサポートされているステンシルを使用して描画メソッドを呼び出すように強制する必要があります。「publicabstractvoiddraw(Stencil s)」のような抽象メソッドを定義することはできません。これは、プログラマーが任意のステンシルをsquareクラスに渡すことができるのに対し、squareクラスは「Stencil1」のみをサポートするためです。

何か案は?

Update1: ​​シェイプクラスはサブクラスで使用されるステンシルを気にしないことを追加する必要がありますが、サブクラスは他のクラスでも使用されるため、サポートされているステンシルのみがコンパイラによって受け入れられるようにdrawメソッドを定義することが重要です。 。

4

4 に答える 4

7
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();
   }
}
于 2009-05-04T14:38:24.593 に答える
1

おそらく最初のデザインを再考する必要があると思います。

もちろん、 instanceofなどを使用してこれを回避することもできます。ただし、これにより、非常に混乱するAPIが発生します(これを使用している場合)。

于 2009-05-04T14:36:46.423 に答える
0

コンパイル時にこれをキャッチしたい場合は、次のオプションが思い浮かびます。

  • 抽象ステンシルのセットを作成します。特にあなたがそれらをグループ化できると思うなら。したがって、複数の「正方形」ステンシルがある場合は、SquareStencil抽象型を作成し、そこから具象インスタンスを派生させます。抽象ステンシルクラスのサブセットとしてそれらを作成することもできます。
  • drawメソッドをオーバーロードします。ジェネリックである必要はありません。コンパイラーに、ジョブに適切な方法を選択して支援させてください。
于 2009-05-04T14:36:11.103 に答える
0

abstact Stencilを定義し、サブクラスコンストラクターに使用するステンシルクラスを決定させます。

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
于 2009-05-04T14:39:31.580 に答える