クラスAがあるとしましょう
class A
{
Z source;
}
ここで、コンテキストは、「Z」が継承ツリー内の共通クラスを共有しない異なるクラス(たとえば、BとC)のインスタンスである可能性があることを示しています。
素朴なアプローチは、「Z」をインターフェイスクラスにし、クラスBとCに実装させることだと思います。
しかし、クラスAのインスタンスが使用されるたびに、「ソース」のタイプを知る必要があるため、何かがまだ私を納得させません。したがって、すべてが複数の「ifs」で終了します。将来的には、他のクラスがZを実装する可能性があり、このタイプの「ifs」をハードコーディングすると、間違いなく何かが壊れる可能性があります。
Zのインスタンスタイプごとに行われる作業が異なるため、Zに関数を追加しても問題を解決できないという問題が発生しています。
誰かが私にアドバイスをしてくれることを願っています。おそらくいくつかの有用なデザインパターンについてです。
ありがとう
編集:Aのインスタンスを取得するときにどこかで行う作業は、インターフェイスZの背後にあるクラスによってまったく異なります。これが問題です。「重要な仕事」を行うエンティティはZではなく、他の誰かです。 Zが誰であるかを知りたい。
Edit2:たぶん具体的な例が役立つでしょう:
class Picture
{
Artist a;
}
interface Artist
{
}
class Human : Artist { }
class Robot : Artist {}
今どこかに、のインスタンスがありますPicture
、
Picture p = getPicture();
// Now is the moment that depending if the type of `p.a` different jobs are done
// it doesn't matter any data or logic inside Human or Robot