最近、高速列挙を使用しているときに予期しない動作に気付きました。後から考えると、おそらく高速な列挙が意図した以上のことを行うことを期待していたので、実際にどのように機能するかについての説明を探しています。
2 つの子クラス3SidedShapeと4SidedShapeを持つ親クラスShapeがあるとします。3 面と 4 面の両方のクラスのオブジェクトを含むmyShapesという配列があります。
配列myShapesを検索したいが、私がやっていたことは 3 つの側面の形状だけに関心がある場合:
for (3SidedShape *shape in myShapes)
私の考えでは、クラス3SidedShapeのオブジェクトのみを反復処理すると思いましたが、そうではありませんか? 好むと好まざるとにかかわらず、すべてのオブジェクトを3SidedShapeとしてキャストしていると思います。私は完全に異なるクラスとして後でオブジェクトを返す夜です。確かに、両方のクラスにないメソッドを呼び出しているわけではありませんが、クラスの兄弟が問題なく簡単に再キャストされるとは思っていませんでした。私はここでラッキーだったのですか、それとも関係に関係なく好きなクラスとして列挙できますか? 列挙中に実際に何が起こるか説明できる人はいますか?