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()or之类的事情,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 classes 来定义更具体的功能,例如,对于所有四边形。

最后创建扩展相关基类的具体形状:

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 回答