2012-06-27 96 views
0

我有我想要一個生成的對象:Java繼承和包裝

  1. 保留現有的功能,而無需注入構造函數和重寫每一個方法調用injectedObject.sameMethod()
  2. 向該生成的對象添加其他功能而不修改生成的對象。

添加更多功能。

例如:

public class GeneratedObject { 
    public String getThis() { ... } 
    public String getThat() { ... } 
} 

public interface ObjectWrapper { 
    String doThisWithThat(); 
} 

public class ObjectWrapperImpl extends GeneratedObject implements ObjectWrapper { 
    String doThisWithThat() { ... } 
} 

然而,向下轉換是不允許的,什麼是不重寫一堆的冗餘代碼來包裝對象的正確實施?

+4

'來生成對象添加額外的功能,而無需修改。如果我理解正確的產生object.',這聽起來像'我要一張桌子加進了一個房間而不觸及room.'我希望的矛盾是顯而易見的那裏。另外,我不完全理解這個問題。這個例子如何相關? – cklab

+1

組成而不是繼承也許? – assylias

+0

@cklab我想說的,以適應你的比喻,是'我想在我的房間外面添加一張桌子,同時仍然可以訪問我的房間' – shuniar

回答

1

我認爲decorator pattern可以幫助你:「Decorator模式可以用來在運行時擴展(裝飾)的某個對象的功能,獨立的同一類的其他實例」

+0

-1:似乎他無法控制'GeneratedObject'。在這種情況下,您必須使用動態代理(至少部分)實現裝飾器模式。 –

0

如果您可以從GeneratedObject中提取接口,那麼可以使用dynamic proxy來完成此操作。您將創建一個代理實現提取的接口和ObjectWrapper,調用處理程序將所有對GeneratedObject接口中方法的調用傳遞給代理,並將doThisWithThat()呼叫發送到其他地方。

副代表並不漂亮,但醜陋至少是本地化的。