4

これが取り引きです:私は異なるクラスの2つのオブジェクト、 aDataSizeActionと aを持っていDataColorActionます。EncoderActionクラスには、チェーンのすぐ上にある共通の祖先があります。

これらのオブジェクトはどちらもsetScale(int scale)、実行するエンコーディングのスケール タイプを設定するメソッドを公開します。このメソッドは、どちらの場合も同じことを行います。

ただし、このメソッドは共通の祖先には存在しません (ところで、この OO は私が使用しているライブラリであり、設計は私の裁量次第ではありません)。

DataSizeAction または DataColorAction を受け取り、そのオブジェクトで setScale を呼び出すメソッドを書きたいと思います。

私の質問は次のとおりです。個別のケースを でブルートフォースする前にinstanceof、これを処理するよりエレガントな方法はありますか?

ありがとう!

4

2 に答える 2

4

階層にインターフェイスを追加できますか?

interface IScalable {
   void setScale(int scale);
   int getScale();
}

class DataSizeAction extends EncoderAction implements IScalable {
   ...
}

class SomeoneElse {
   private int scale = 2;

   public void setScale(IScalable scalable) {
      scalable.setScale(this.scale);
   }
}
于 2012-08-10T19:08:49.187 に答える
3

これを試して:

  1. 拡張する別のクラスを作成しますEncoderAction
  2. setScaleその中で抽象メソッドとして宣言する
  3. 新しいクラスを作成DataSizeActionしてDataColorAction拡張します。

これで、コードを記述して新しい基本クラスのインスタンスを参照し、instanceofチェックの呼び出しを回避できます。

: ここにあるものは機能するはずですが、Jonathonの回答をお勧めします。これは機能の保証であり、オブジェクトの構成とは何の関係もないため、インターフェイスを使用することをお勧めします。

于 2012-08-10T19:08:09.313 に答える