2013-03-26 64 views
0

我有一個GWTCanvas被繪製幾個Shapes,像(我不知道如果我要爲一個接口的擴展或執行):如何根據instanceof對某個對象執行操作?

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對象應該遵循與刪除不同的規則10(因爲他們以後會代表我的應用程序中的某些對象)。

正如我還在設計:什麼你能建議我以後能有一個List,我只是執行像shape.draw()delete(shape)和適當的方法,事情就會被自動調用?

我可以Interface Shape這裏實現這一點:

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

,這將對我必須從draw()邏輯複製所有代碼,我所有的Shape類的缺點在於:implement這個接口,即使它們是隻是略有不同,或者根本沒有差異。

難道還有更好的方法嗎?

+0

接口,然後是具有默認/通用功能的抽象類,以及擴展抽象類的具體類。 – 2013-03-26 10:00:38

+0

計算出該方法的哪些位可以不同並且「抽象」那些。在「抽象形狀」中實現核心功能,以便在需要時覆蓋。 – 2013-03-26 10:00:59

+0

除了實現繼承,您還可以按對象組合或靜態幫助方法共享代碼。無需複製/粘貼代碼。 – Thilo 2013-03-26 10:01:54

回答

3

創建一個interface,它定義了Shape必須執行的操作 - 即定義合同。

創建一個abstract class,定義在所有Shape實例中重複的核心功能。

也許會創建更多的abstract class es,它定義了對所有四邊形都會重複的更具體的功能。

最後創建擴展相關基類的具體形狀:

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可以直接,如果你需要。

相關問題