2012-10-08 118 views
0

我是一個Java新手,遇到了一些問題。我想要一個班級成爲另一個班級。很難用抽象的方式來解釋它,所以我給你舉個例子。擴展一個返回的實例

public class WorldGuard extends WorldGuardPlugin { 
    public WorldGuard(Plugin parent) { 
     WorldGuardPlugin plugin = parent.getServer().getPluginManager().getPlugin("WorldGuard") 
     // make plugin the actual class 
    } 
} 

WorldGuard應該像這裏的某種包裝一樣。在構建時,它獲取一個參數parent,在該基礎上找到WorldGuardPlugin的實例。該類現在應該變成該實例。 它在JavaScript中很簡單,我只是返回實例,但我不能在Java中完成此操作。

+0

哦,看,它是一個bukkit插件問題。你有沒有在irc.esper.net上的#bukkitdev中提問?這就是說,你的問題沒有什麼意義,我無法從中得到任何東西。試着看看現有的插件。 – Wug

+1

您無法更改對象的類別。你所能做的只是包裝對象或者用另一個類創建一個新對象。 –

+0

這個包裝行爲會是個訣竅。但是,我如何告訴班級將所有呼叫委派給其他班級? – buschtoens

回答

2

我不太清楚你想要做什麼。一個班級不能「成爲另一個班級」。但是,也許你的問題只是當你應該使用一個普通函數時你試圖使用構造函數。也許你想要做的是這樣的:

public class WorldGuard extends WorldGuardPlugin 
{ 
    public static WorldGuard getFromPlugin(Plugin parent) 
    { 
    return (WorldGuard) parent.getServer().getPluginManager().getPlugin("WorldGuard"); 
    } 
} 

這將通過父對象獲取對象並將其作爲WorldGuard對象返回。

+0

我知道我必須要做那種醜陋的額外功能。我只想讓整個班級表現得像這樣一個單一的功能,因爲創建一個新班級只是爲了獲得一個參考而讓我覺得很開心...... – buschtoens

+0

您不必創建一個新班級。無論如何,我認爲你需要WorldGuard課程。只需將靜態函數放入WorldGuard類。 – Jay

0

您不能更改在構造函數中構造的對象的類型。根據定義,構造函數構造該類(例如A的構造函數創建類型A)。

在您的例子,WorldGuard延伸WorldGuardPlugin,這意味着WorldGuard的類型WorldGuardPlugin。也許有一種方法來初始化WorldGuardPluin類(在構造函數中使用super的調用)並使用所需的屬性。

1

班級不能成爲其他班級。

我想你可以選擇以下可能性之一。

  1. 創建類的實例的用戶工廠。工廠將根據您想要的任何邏輯選擇具體的類,並創建「正確」類的實例。如果你想要工廠運行的所有類都可以實現特定的接口,那麼調用者甚至不會知道創建了哪個類的實例。
  2. 使用包裝圖案。在這種情況下,您的實際WordGuard類將包裝其他類的實際實例並委託所有呼叫。
  3. 使用動態代理或字節碼工程解決方案。但是它要複雜得多,而且在大多數情況下不是最好的解決方案。
+0

2)似乎很有希望。有沒有辦法只是說「委派所有的電話到這個班級」? – buschtoens

1

你應該調用WorldGuardPlugin的拷貝構造函數。我的意思是,WorldGuardPlugin應該有一個構造函數,可以創建類似類的給定實例的副本:

WorldGuardPlugin pg = new WorldGuardPlugin(anInstance); 

如果是這樣,則情況下,你是幸運的。你可以簡單地做:

public class WorldGuard extends WorldGuardPlugin { 
    public WorldGuard(Plugin parent) { 
     super(parent.getServer().getPluginManager().getPlugin("WorldGuard")); 
    } 
} 

這將使「WorldGuard這裏像某種包裝的」。您仍然可以調用WorldGuardPlugin中定義的方法在WorldGuard的實例上,同時能夠將方法本身添加到WorldGuard

+0

不幸的是'WorldGuardPlugin'不提供那個拷貝構造函數。 – buschtoens

+0

還是有一個參數化的構造函數,你可以用它自己初始化成員? –

+0

構造函數不帶任何參數。這種方法不會導致任何地方。 – buschtoens