2011-12-02 56 views
0

可以說我有A類,調用在任一B類或C類的靜態方法從哪個類,它會調用將取決於A類的構造函數傳遞參數類B和C中需要調用的方法具有相同的方法簽名。那麼,有沒有辦法做這樣的事情:「存儲」一類的調用靜態方法

Object call; 
if (type == 0) 
    call = ClassA; 
else 
    call = ClassB; 

call.someMethod(); 

我知道它可以用一個接口,同時具有B類和C實現接口但這需要創造B或C每次的對象來完成上述呼叫發生,這是相當資源密集型的。所以,我想知道是否有其他方法可以做到這一點。

編輯:對不起,如果這不明確,但Object call是一個類變量和方法調用類B和C需要在類中的其他方法,而不僅僅是構造函數。

+1

你可以使用實現接口的單例。 – CodesInChaos

+0

對我來說,就像你想在這裏擺脫面向對象並做功能編程:將B或C類的方法傳遞給A而不是完整的類。 –

回答

5

請勿使用靜態方法。使用接口(或基類),創建兩個類的單個實例並將它們存儲在靜態字段中。這樣,您不必每次都實例化,只需從字段中獲取現有實例即可。

+0

我大致採用了這種方法,但只是讓B類和C類使用單例,因爲替代方案並不適合這個問題。謝謝您的幫助。 –

0

在您的示例中,您並未創建任何對象。

調用是靜態的,所以創建對象不是必需的。

4

因爲方法是靜態的,我假設我們正在談論的是你不控制類的輔助方法(否則你可能例如它們移動到同一個類)。在任何情況下,你可以用下面的辦法,在各種環境下工作:

使用持有Action指向相關方法的變量。例如:

Action action; 
if (type == 0) 
    action = ClassA.SomeMethod; 
else 
    action = ClassB.SomeOtherMethod; 

action(); 

當然你也可以,如果你想傳遞參數給被調用的方法使用其他委託類型(例如的Action仿製藥)。

的一個限制,這種方法的缺點是,你可能想調用的所有方法都需要具有相同的簽名(數目和類型的參數),和相同的返回類型。但是你仍然可以解決此通過建立適配器的功能,這是非常容易使用lambda表達式做到:

// Assume that ClassA.SomeMethod accepts an int parameter 
// If you know the value that should be passed, you can adapt it like this: 
if (type == 0) 
    action =() => { ClassA.SomeMethod(42); }; 
+0

與另一種解決方案,因爲類B和C有一堆需要調用的靜態方法,並將它們全部存儲在一個單獨的變量中並不太有用。但使用函數指針可以提高解決方案的性能(在大多數情況下可能比單例更好)。 –

+0

@ShardulUpadhyay:在我看來,你也選擇了更合適的解決方案。這「一堆方法」改變了平衡。 – Jon

1

爲什麼不把你的if()語句內調用的方法?

if(type == 0) 
{ 
    ClassA.someMethod(); 
} 
else 
{ 
    ClassB.someMethod(); 
} 

如果你需要做一些與該方法的返回值,即通過聲明語句外返回的對象,併爲其分配條件塊內部的值仍然有可能。

+0

:(我需要輸入更快 – musefan

1

嗯,使用一個if if來設置一個變量來調用一個通用函數。正如你打算有if/else無論如何,爲什麼不這樣做呢......

if (type == 0) 
    ClassA.SomeMethod(); 
else 
    ClassB.SomeMethod();