簡體   English   中英

如何根據instanceof對對象采取行動?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM