可能であれば、このアプローチのメリットについては議論したくありません。答えは「いいえ」だと思います。しかし、誰かが私を驚かせるかもしれません!
コア ウィジェット クラスがあるとします。calculateHeight()高さを返すメソッドがあります。高さが大きすぎます - これにより、(たとえば) ボタンが大きすぎます。DefaultWidget を拡張して独自の NiceWidget を作成し、独自のものを実装してより適切calculateHeight()なサイズを返すことができます。
現在、ライブラリ クラス WindowDisplayFactory は、かなり複雑なメソッドで DefaultWidget をインスタンス化しています。あなたは、NiceWidget を使用したいと考えています。ファクトリ クラスのメソッドは次のようになります。
public IWidget createView(Component parent) {
DefaultWidget widget = new DefaultWidget(CONSTS.BLUE, CONSTS.SIZE_STUPIDLY);
// bunch of ifs ...
SomeOtherWidget bla = new SomeOtherWidget(widget);
SomeResultWidget result = new SomeResultWidget(parent);
SomeListener listener = new SomeListener(parent, widget, flags);
// more widget creation and voodoo here
return result;
}
それが取引です。その結果、DefaultWidget は他のオブジェクトの階層の奥深くにあります。質問 - このファクトリ メソッドを取得して自分の NiceWidget を使用するにはどうすればよいですか? または、少なくとも自分のものcalculateHeight()をそこに入れます。理想的には、DefaultWidget にモンキー パッチを適用して、その calculateHeight が正しいことを実行できるようにしたいと考えています...
public class MyWindowDisplayFactory {
public IWidget createView(Component parent) {
DefaultWidget.class.setMethod("calculateHeight", myCalculateHeight);
return super.createView(parent);
}
}
これは私が Python や Ruby などでできることです。名前は私が思いつきましたsetMethod()。私に開かれている他のオプションは次のとおりです。
createView()ファクトリ クラスから継承する独自のクラスにメソッドのコードをコピー アンド ペーストする- 大きすぎるウィジェットとの生活
ファクトリ クラスは変更できません。コア プラットフォーム API の一部です。返された結果を反映して、(最終的に) 追加されたウィジェットにたどり着きましたが、それはいくつかのウィジェット層であり、どこかで他のものを初期化するために使用され、奇妙な副作用を引き起こしています。
何か案は?これまでの私の解決策はコピー アンド ペーストの仕事ですが、それはプラットフォームの新しいバージョンにアップグレードするときに親ファクトリ クラスの変更を追跡する必要があるため、他のオプションを聞くことに興味があります。