0

私はGWT Canvasいくつかを描いていますShapes、のように(私がインターフェースの拡張または実装をするつもりかどうかはわかりません):

Rectangle extends/implements Shape;
Ellipse extends/implements Shape;

Shape独自のコンテキストメニューを表示したい場合、つまり、コンテキストメニューウィジェットを次のようなポップアップに設定します。

if (shape instanceof Rectangle) {
  Widget contextmenu = new RectangleContextMenu();
} else if (shape instanceof Ellipse) {
  Widget contextmenu = new EllipseContextMenu();
}
popup.setWidget(contextmenu);
popup.show();

これは一般的な設計上の質問である可能性があるため、ここでGWTを使用していることは問題ではありません。

Shapeオブジェクトを操作し、そのインスタンスに属する必要のあるアクションを常に呼び出すにはどうすればよいですか?

たとえば、他の操作は次のようになります。

  • draw():もちろん、楕円は長方形とは異なる方法で描画されます

  • rotate():楕円は異なる回転規則に従う場合があります

  • delete()Ellipse:後で、オブジェクトの削除は、削除とは異なるルールに従う必要があると想像できましたRectangles(後で、アプリ内の特定のオブジェクトを表すため)。

私はまだ設計中です。後で、shape.draw()またはdelete(shape)などを実行できるリストを作成して、適切なメソッドが自動的に呼び出されるようにするために、何を提案できますか?

私はここでこれを達成することができましInterface Shapeた:

interface Shape {
   abstract draw();
   abstract delete(Shape);
   abstract rotate();
}

draw()、これには、ロジックからこのインターフェイスのすべてのShapeクラスにすべてのコードをコピーする必要があるという欠点がありimplementます。たとえそれらがわずかに異なっていても、あるいはまったく異なっていなくても。

より良いアプローチはありますか?

4

1 に答える 1

3

interfaceしなければならないことを定義するを作成しShapeます-つまり、契約を定義します。

すべてのインスタンスabstract classで繰り返されるコア機能を定義するを作成します。Shape

たぶんabstract class、たとえばすべての四辺形に対して繰り返される、より具体的な機能を定義するesをさらに作成します。

最後に、関連する基本クラスを拡張する具体的な形状を作成します。

interface Shape {

    void draw();

    void delete();

    void rotate();
}

abstract class BaseShape implements Shape {

    @Override
    public void draw() {
        //do generic stuff
        //call specific method
        specificDrawStuff();
        //do more generic stuff
    }

    abstract void specificDrawStuff();

    @Override
    public void rotate() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void delete() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

class Square extends BaseShape {

    @Override
    void specificDrawStuff() {
        //specfic stuff here
    }
}

このようにして、一般的なものをすべて抽象化できますが、implement Shape必要に応じて直接抽象化することもできます。

于 2013-03-26T10:08:50.713 に答える