如何根据实例对对象进行操作?

时间:2013-03-26 09:56:56

标签: java oop gwt

我有一个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():ob当然椭圆的绘制方式与矩形不同

  • rotate():椭圆可能遵循不同的轮换规则

  • delete():我后来可以想象删除Ellipse个对象应该遵循与删除Rectangles不同的规则(因为它们稍后会代表我的应用中的某些对象)

由于我还在设计中:您可以建议我以后可以使用List来执行shape.draw()delete(shape)之类的操作,并自动调用相应的方法?

我可以通过Interface Shape来实现这一点:

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

,这样做的缺点是我必须将draw()逻辑中的所有代码复制到Shape这个接口implement的所有{{1}}类,即使它们只是略有不同,或者它们根本没有区别。

有没有更好的方法?

1 个答案:

答案 0 :(得分:3)

创建一个interface,用于定义Shape必须执行的操作 - 即定义合同。

创建abstract class,定义在所有Shape个实例中重复的核心功能。

也许创建更多abstract class来定义更具体的功能,例如,对于所有四边形都会重复。

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

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