1

私はJavaの無名クラスについて少し迷っています。それらについて読んだことがありますが、このクラスをどのように使用できますか:

private abstract class CustomRectangle {
    protected final int width;
    protected final int height;
    protected final int xOffset;
    protected final int yOffset;
    protected final int borderSize;

    public CustomRectangle(final int width, final int height, final int xOffset, final int yOffset, final int borderSize) {
        this.width = width;
        this.height = height;
        this.xOffset = xOffset;
        this.yOffset = yOffset;
        this.borderSize = borderSize;
    }

    abstract void inBorder(final int dx, final int dy);

    abstract void outBorder(final int dx, final int dy);

    public void draw(Graphics2D g2d) {
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int dx = Math.min(x, width - 1 - x);
                int dy = Math.min(y, height - 1 - y);
                if (dx < borderSize || dy < borderSize) {
                    inBorder(dx, dy);
                }
                else {
                    outBorder(dx, dy);
                }
                g2d.drawLine(x + xOffset, y + yOffset, x + xOffset, y + yOffset);
            }
        }
    }
}

別の方法で、次のことを同時に実行します。

  1. CustomRectangle を拡張して InBorder() と outBorder() をオーバーライドする
  2. draw() メソッドを呼び出して、新しい CustomRectangle を描画します。

これを行う簡単な方法が必要であり、CustomRectangle を描画するたびに大量のクラスを作成する必要はありません。

助けていただければ幸いです:)

ソリューションを含む編集:

    new CustomRectangle(CARD_DIMENSION.width, CARD_DIMENSION.height, 0, 0, 5) {
        @Override
        public void inBorder(final int dx, final int dy) {
            g2d.setColor(new Color(red, green, blue, 255 - Math.min(dx, dy)));
        }

        @Override
        public void outBorder(final int dx, final int dy) {
            g2d.setColor(new Color(red, green, blue, 192 - Math.min(dx, dy)));
        }
    }.draw(g2d);

あまりきれいに見えないかもしれませんが、私のアプリケーションの設計には非常に便利です。

4

2 に答える 2

7

拡張する無名クラスの構文は次のCustomRectangleようになります。

CustomRectangle r = new CustomRectangle() {
    @Override
    public void inBorder(final int dx, final int dy) {
        // implementation
    }
    @Override
    public void outBorder(final int dx, final int dy) {
        // implementation
    }
}

これらの匿名クラスの使用を回避する別のアプローチは、実装するヘルパー オブジェクトを使用して四角形クラスをパラメーター化することinBorderですoutBorder。その場合、rectangle クラスは抽象である必要はありません。代わりに、ヘルパー オブジェクト (構築時またはセッターを介して提供される可能性があります) に実装を委譲します。

于 2013-04-04T15:24:42.650 に答える
0

クラスのインスタンスが必要なときに必要な関数を定義するだけで、この抽象クラスを無名クラスで拡張できます。次のようになります。

CustomRectangle rect = new CustomRectangle() {
    @Override
    public void inBorder(final int dx, final int dy) {
        // Your implementation here.
    }
    @Override
    public void outBorder(final int dx, final int dy) {
        // Your implementation here.
    }
}

次に、必要なものを呼び出すだけですrect.draw()。これは、他のオブジェクトと同じです。

于 2013-04-04T15:27:23.187 に答える