私は、これは前に頼まれている必要があります確信しているが、私は同様の例を見つけるように見えることはできません。私はよく多型とメソッドのオーバーロードを理解しますが、ここで私をエスケープ溶液で一見単純なシナリオです:多型のようなパラメータの処理 - 単純なOO?
だが、私はいくつかの派生クラスで基本クラスを持っているとしましょう。私は、この例
base Shape
derived Circle extends Shape
derived LineSeg extends Shape
などのための形状を使用します
今、形状はというメソッドを持って交差する(他の)彼らが交差する場合、別の形状に対してテストを参照すること。多型を使えば、サークル、LineSegなどは、自分の「交差」のメソッドを実装することができ、そして、メソッドのオーバーロードで、私は簡単に必要なすべての組み合わせを実装することができます。どのように見ることは容易です例えば、
Circle.intersect(LineSeg)
Circle.intersect(Circle)
LineSeg.intersect(Circle)
など
これまでのところは良いです。
問題は、私は形状の中央リストを続けるならば、私はこれをしたい、次のとおりです。
for some shape s
Foreach shape in Shapes
if (s.intersect(shape)) - do something
メソッドのオーバーロードは、「交差」を選択するので、現在、私は、これが可能であるかを確認していませんメソッドを使用して、適切なパラメータ型ではなく、基本型Shapeに一致させます。タイプとダウンキャストをチェックするif-elseチェインなしでこれを行うにはどうすればよいですか?
ところで、私は、Javaを使用していますが、私は基本的な設計の問題であると思われるので、言語は全く関連性があることを確認していません。とてもシンプルに見えますが、私は何が欠けていますか?
ありがとうございます!
解決済み(ありがとうございました!)、詳細はこちらをご覧ください。それは必要な適切な型を持っているとして、基本的には、(ビジターパターン?)適切なメソッドを呼び出す派生クラスでのコールバックを持つことによって、あなたは、適切なintersectメソッドを呼び出すために、「この」キーワードを使用することができます。
と呼ばれています。たとえば、LISPは* multimethods *をサポートしていますが、関数型プログラミング言語のいくつかは同じものをサポートしていると思います。 Javaでは、これは通常* double dispatch *と呼ばれ、GoF Visitorパターンは移動方法です。 –
あなたのデザインを忠告しないでください。あなたの継承は少し間違っています。線分は実際には形状ではありません。彼らは形を作ります。問題の2つの図形を構成した線分、形に応じて、多くのいずれかの交差点をチェックします:) – ChiefTwoPencils
@ C.Lang、良いキャッチですが、 "wall"に改名するとどうなりますか?それは基本的にどのように使用されていますが、それをlineSegと呼ぶと、他のより複雑な図形でも簡単に使用できます。 – user1922401