ShapeManager
したい形状のリストを持つ
基本クラスがありenumerate()
ます。次に、s の代わりにColoredShapeManager
特殊化された s を処理したい特殊化があります。ColoredShape
Shape
+----------------+ +-------------------------------------+
| Shape | | ShapeManager |
|----------------| |-------------------------------------|
| + id: int | | # shapes: List<Shape> |
| | | |
| | | + ShapeManager() { |
| | | shapes.add(new Shape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use s |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
^ ^
| |
+ +
+----------------+ +-------------------------------------+
| ColoredShape | | ColoredShapeManager |
|----------------| |-------------------------------------|
| + color: int | | + ColoredShapeManager() { |
| | | shapes.add(new ColoredShape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use (ColoredShaped) s |
| | | // will fail for Shapes |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
ShapeManager がその子と共有する必要があるかどうかわかりませんを処理したいshapes: List<Shape>
ので、これには欠陥があるようです。したがって、要素をキャストしますが、一部の要素 (基本クラスによって追加された要素) は型であり、キャストは失敗します。ColoredShapeManager.enumerate()
ColoredShape
Shape
あれは:
- 両方のタイプの形状がリストに表示されます
shapes
。 enumerate()
子マネージャで にアクセスできる必要がありますColoredShape
。
リストを分割して、2 つのマネージャーのそれぞれに非公開リストを作成する必要がありますか? 次に、子で列挙すると、「その」タイプの形状のみが反復さenumerate()
れ、開始/終了で親の形状が呼び出されます。