[英]How to act on an object depending on the instanceof?
我有一個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()
:當然,橢圓的繪制與矩形的繪制不同
rotation rotate()
:橢圓可能遵循不同的旋轉規則
delete()
:我以后可以想象刪除Ellipse
對象應該遵循與刪除Rectangles
不同的規則(因為它們稍后將代表我的應用程序中的某些對象)。
正如我仍在設計中一樣:您有什么建議呢?我以后可以擁有一個List,可以在其中執行shape.draw()
或delete(shape)
,並且相應的方法將自動被調用?
我可以在這里通過Interface Shape
實現:
interface Shape {
abstract draw();
abstract delete(Shape);
abstract rotate();
}
,這樣做的缺點是我必須將所有代碼從draw()
邏輯復制到implement
此接口的所有Shape
類中,即使它們只是稍有不同,或者根本沒有區別。
有更好的方法嗎?
創建一個定義Shape
必須做什么的interface
-即定義一個合同。
創建一個abstract class
,該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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.