私はクラスのコレクションを持っています。それはDerived1, Derived2, ..., Derived6
と呼ばれ、それぞれが基本クラスBase
のサブクラスです。これらのクラスはサードパーティのJavaパッケージで定義されています。次のOOPデザインにはより良い選択肢がありますか?
私はこれらのオブジェクトの人間が読める表現を書き出すクラスを作成しています。私はこの問題に次のようにアプローチしました。それぞれi=1,2,...,6
とString transform(Base object)
に対してメソッドString transform(Derivedi object)
を定義します。
たとえば、Base obj = new Derived3(...)
と、obj
の表現を計算する場合に問題が発生します。式transform(obj)
は、 ""のメソッドを呼び出します。このメソッドは、 "正しい"メソッド(この場合は、String transform(Derived3)
のシグニチャを持つメソッド)を呼び出す必要があります。
メソッドString transform(Base object)
は、それぞれi=1,2,...,6
の形式の一連の条件文を使用して適切なメソッドに作用します。if (obj instanceof Derivedi)
(私がパッケージをコントロールしていたなら、抽象メソッドString toReadable()
をベースクラスに実装する必要があります。残念なことに、この場合、私はパッケージを制御できません)
私はしませんこのソリューションのように(それは簡単に分かります)。 String transform(Base)
のこの実装に代わるものは何ですか?
この問題がどのように発生する可能性があるのか分かりません。あなたは 'toString()'メソッドをオーバーライドすることを考えましたか?または、あなたが記述したクラス階層内の別の単純な上書き?パラメータを必要とする別の場所の代わりに? – EJP
多型ではありません。多態性は、各クラスにtoHumanRepresentation()メソッドを持たせることで、これは 'this'を人間の表現に変換します。あなたがクラスをコントロールしていない場合は、instanceofのチェックを除いて、あなたができることはあまりありません。 –
これはポリモフィズムではなく、ポリモーフィズムは(toReadable()アプローチのように)すべてのオブジェクトに対して同じメソッドを呼び出すことになります。これにはJavaの仕組みが組み込まれています。すべてのクラスにはObjectから継承されたtoString()メソッドがあり、クラス固有の動作のためにオーバーライドすることができます。そうでない場合は、if-elseシーケンスのような非OOソリューションに頼らなければなりません。あなたがスイッチケースを持っている場合、またはこの場合はその醜いif-elseシーケンスのいとこのたびに、アクションにチェックしている値のマップに置き換えることができます。 –