これは以前に尋ねられたに違いないと確信していますが、同様の例が見つからないようです。私はポリモーフィズムとメソッドのオーバーロードをよく理解していますが、これは私を逃れるソリューションを備えた一見単純なシナリオです。
いくつかの派生クラスを持つ基本クラスがあるとしましょう。この例では形状を使用します
base Shape
derived Circle extends Shape
derived LineSeg extends Shape
等
現在、形状には、交差するかどうかを確認するために別の形状に対してテストする intersect(other) というメソッドがあります。ポリモーフィズムを使用すると、Circle、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 を使用していますが、基本的な設計上の問題のように思われるため、Java が完全に関連しているかどうかはわかりません。とてもシンプルに見えますが、何が欠けていますか?
ありがとう!
以下で解決しました (ありがとう!)、詳細はこちらをご覧ください。基本的に、適切なメソッド (ビジター パターン?) を呼び出す派生クラスにコールバックを設定することで、"this" キーワードを使用して適切な交差メソッドを呼び出すことができます。これには適切な型が必要です。