我有一个基类ShapeManager
,其中包含我想要的形状列表
enumerate()
。然后有一个专门ColoredShapeManager
化想要处理专门ColoredShape
的 s 而不是Shape
s:
+----------------+ +-------------------------------------+
| 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
s。因此它会转换元素,但某些元素(由基类添加的元素)是类型Shape
的并且转换会失败。
那是:
- 两种形状都在列表中
shapes
。 enumerate()
在子管理器中应该可以访问ColoredShape
.
我是否应该拆分列表并在两个经理中的每一个中创建私人列表?然后在孩子中枚举只会迭代“它的”类型的形状并enumerate()
在开始/结束时调用父母的形状。