2013-03-22 112 views
0

如何從不是另一個類中的對象的類調用一個方法,並且與這個其他類沒有共同之處?如何從其他沒有實例的類中調用方法?

在我的情況:

class GridUI { 
    com.google.gwt.user.cellview.client.DataGrid grid; 

    public void refresh() { 
     dataGrid.redraw(); 
    } 
} 

class SomeBackendService() { 
    public foo() { 
     //have to trigger refresh of a specific grid 
    } 
} 

一種可能性是使refresh()gridstatic。但這是糟糕的設計,我不能使用這種方法,因爲我想使用GridUI的幾個實現。

那麼,如何從任何不包含此網格的服務作爲對象在我的應用中刷新某個網格類?

+0

您可以爲您的網格創建一個單獨的「容器」,後端服務可以查詢這些容器。 – sje397 2013-03-22 13:53:07

+0

那麼,您將刷新哪個GridUI實例? – Zutty 2013-03-22 13:53:15

+0

好吧......或者做靜態或將這些對象作爲參數傳遞。你還看到/感受到了什麼其他方式?編輯:通常你告訴你的渲染窗口(gui)什麼演員屬於它,並在需要時調用gui上的更新 – Najzero 2013-03-22 13:53:27

回答

0

或者創建一個組件註冊表(基本上是一個Map<String,Grid>),然後從SomeBackendService中使用它的id作爲註冊表中的鍵獲取網格。 (我想你知道你要刷新其格,對吧?)

小心登記,但:

  • 確保它們是線程安全的,如果需要的話(可能是真的在UI應用程序)
  • 他們往往填滿,如果處理不當
+0

好吧,所以基本上我會把它們保存在靜態地圖中,然後可以從任何一個E訪問它們?目前這可能會奏效,所以我正在採取這種方法。無論如何,我覺得從設計的角度來看,這不是很乾淨...... – membersound 2013-03-22 14:10:34

+0

組件註冊表/緩存是一個常見的功能,JNDI,數據庫緩存等......它們在編程良好時很乾淨,俗話說「計算機科學只有兩個難題:高速緩存失效,命名事件和錯過1次錯誤」。如果你不想要註冊表,使用建議的事件驅動模型......但要小心,你可能很快就會結束監聽器的緩存! :) – 2013-03-22 14:20:56

+0

我明白了。由於我只需要幾個網格刷新,可能從KISS的角度來看緩存是首選解決方案在這裏。 – membersound 2013-03-22 14:42:44

4

只需創建內存泄漏和火災爲它的Event在您服務,讓您的網格寄存器爲Event。最好使用EventBus

按照接受的答案中的建議使用靜態的Map<String, Grid>可以工作,但不適用。您冒着犯錯的風險,並且在網格數量增加時不容易管理。

EventBus方法是更多的前期工作,但最終它是一個更好的方法。您可以在整個應用程序中重複使用EventBus。它確實有助於保持聯繫。您也可以輕鬆地獲得不同的對象,只需很少的努力即可在相同的Event上執行操作。

+0

+1 for eventbus :) – 2013-03-22 14:16:32

-2

對不起,沒有回答那麼長時間,我在度假。

接口是某種類。 但他們沒有實現任何方法,他們有空的方法體。

每個實現接口的類通常必須實現它的方法。

在C#中,你會做:

enter code here 

    interface IMyInterface 
    { 
     void PleaseImplementMe(); 
    } 


    class clMyInterface :IMyInterface 
    { 

     void IMyInterface.PleaseImplementMe() 
     { 
      MessageBox.Show("One implementation"); 
     }  
    } 





end 

請讓我知道,這是否是有什麼可以幫你或沒有。

相關問題