我有一个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}}类,即使它们只是略有不同,或者它们根本没有区别。
有没有更好的方法?
答案 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
。