0

私はしたい生成されたオブジェクトを持っています:

  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

3 に答える 3

1

デコレータパターンが役立つと思います:「デコレータパターンは、同じクラスの他のインスタンスとは無関係に、実行時に特定のオブジェクトの機能を拡張(装飾)するために使用できます」

于 2012-06-27T21:10:35.350 に答える
0

からインターフェイスを抽出できる場合は、動的プロキシGeneratedObjectを使用してこれを行うことができます。抽出されたインターフェースとを実装したプロキシを作成し、インターフェース内のメソッドへのすべての呼び出しをデリゲートに渡し、呼び出しを別の場所に送信する呼び出しハンドラーを使用します。ObjectWrapperGeneratedObjectdoThisWithThat()

プロキシはきれいではありませんが、醜さは少なくとも十分にローカライズされています.

于 2012-06-27T23:14:49.030 に答える
0

あなたはaspectjを試しましたか? http://www.eclipse.org/aspectj/doc/next/progguide/semantics-declare.html 少し複雑ですが、あなたの要求もそうです。

于 2012-06-27T22:38:56.007 に答える